n Zahlen zufällig verteilen

skee

Mitglied
Hallo,

Ich hab ein kleines Problem und weiss nicht, wie ich es lösen soll:

Ich möchte, wenn ein Account angelegt wird, dasss diesem Account eine zufällige Zahl zwischen 1 und (beispielsweise) 1000 zugewiesen und in die DB geschrieben wird.

Bis hierhin auch kein Problem, aber wie kann ich es machen, dass die nächsten Accounts nur Zahlen benutzen, die noch "frei" sind, also von keinem vorher erstelltem Account benutzt werden?

Wär super, wenn jemand ne Idee hätte.

Danke
Skee
 
Darf ich fragen warum es eine Zahl sein muss?

Sinnvoller wäre ein Hash auf den Usernamen oder die Emailadresse. Somit ist er auch immer unique. Oder einfach nur in der Tabelle mit ID und auto_incement arbeiten. Dann ist die User ID auch immer eindeutig.
 
Zuletzt bearbeitet:
Er hat ja nicht gesagt das er Primärschlüssel damit verteilen will.

Ich würde mir eine rekursive Funktion schreiben, welche

- Einen Zufallswert erstellt
- Prüft ob dieser schon in der Datenbak vorhanden ist
- Wenn ja, neuer Aufruf der Funktion
- Wenn nicht, diesen Wert für die Weiterverarbeitung zurückgeben

Es gibt sicherlich auch noch andere Lösung. Das wäre nur meine Idee.

Gruß soyo
 
PHP:
// Schleifenvariante
do {
$zahl = rand(0,1000);
$rs = mysql_query("SELECT id FROM tabelle WHERE feld = $zahl");
} while (mysql_num_rows($rs) > 0);

// Funktion
function ZahlHolen() {
$zahl = rand(0,1000);
$rs = mysql_query("SELECT id FROM tabelle WHERE feld = $zahl");
if (mysql_num_rows($rs) > 0) return ZahlHolen();
return $zahl;  
}

Wenn du die Zahlenbestimmung nur einmal brauchst, würde ich die Schleifenvariante nehmen, falls du das aber mehrmals in deinem Skript eingebaut hast, halte ich die bereits vorgeschlagene Variante mit der Funktion für sinvoller.
 
Zuletzt bearbeitet:
PHP:
do {
$zahl = rand(0,1000);
$rs = mysql_query("SELECT id FROM tabelle WHERE feld = ".$zahl);
} while (mysql_num_rows($rs) > 0);
 
Die Veränderung ist zwar nicht notwendig, aber wenn du das lieber magst, kannst du das natürlich machen :)
 
Also, erstmal danke für die schnellen Antworten.

Evtl etwas zum Hintergrund:
Das ganze wird für ein Browsergame benötigt. Es gibt eine Karte mit 1000 "Gebieten". Wenn der Account erstellt wird, soll diesem ein zufälliges Gebiet zugeordnet werden.

So, wie ich die geposteten Scripte verstehe, wird nach jedem rand() geguckt, ob es das schon in der DB gibt. Von der Logik her eigentlich recht einfach und praktikabel, aber ich denke, im Extremfall können beim 1000sten Account unglaublich viele DB-Abfragen enstehen, wenn die letzte freie zahl nicht gefunden wird,oder sehe ich da etwas falsch?

Falls noch jemandem was einfällt, immer her damit^^

Skee
 
Zuletzt bearbeitet:
Wir wäre es wenn du aus den noch übrigen "Gebieten" ein Array erstellst und daraus dann per Zufallswert ein Elemet mit den entsprechenden Daten ausliest?

Natürlich ist ein Array nicht zwingend. Eine MySQL Tabelle mit den übrigend Gebieten wäre auch denkbar. Per
Code:
... ORDER BY RAND() LIMIT 0,1

kannst du dann einen zufälligen Datensatz wählen. Wenn du ihn dann auch gleich löscht dürfte es keine Probleme geben.

Gruß soyo
 
Zuletzt bearbeitet:
Zurück