Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

Zufälligen Wert finden, der nicht in einer Datenbank gespeichert ist

Diskussion: Zufälligen Wert finden, der nicht in einer Datenbank gespeichert ist im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Hallo, Ich suche eine möglichst performante Möglichkeit, um einen zufälligen Wert zu finden (z.B. im Bereich von 0-10000), der ...

Antwort
Alt 05.05.08, 20:29   #1 (permalink)
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Eydeet Leistung: Facit NTK
Likes: 4
Standard Zufälligen Wert finden, der nicht in einer Datenbank gespeichert ist

Anzeige

Hallo,
Ich suche eine möglichst performante Möglichkeit, um einen zufälligen Wert zu finden (z.B. im Bereich von 0-10000), der noch nicht in einer Datenbank (z.B. MySQL) gespeichert ist. Dieser Wert soll der Datenbank dann hinzugefügt werden.

Was ich mir überlegt habe, ist folgendes:
1. Einfach per Zufall durchprobieren, bis etwas gefunden ist
2. Eine zweite Tabelle anlegen, in der die Werte gespeichert sind, die noch nicht vergeben sind
3. Alle vergebenen Werte aus der Datenbank holen und an einer zufälligen Position anfangen zu suchen.

Bei Möglichkeit 1 findet man entweder sofort etwas, oder man sucht sich zu Tode (vor Allem, wenn kein Wert mehr frei ist).

Bei Möglichkeit 2 braucht man u.U. Massen von zusätzlichem Speicherplatz, und bei Möglichkeit 3 u.U. eine Menge Memory.

Fällt vielleicht jemandem unter euch eine intelligentere Lösung ein? Bis jetzt gefällt mir Möglichkeit 3 am Besten.

Mfg, Eydeet

Eydeet ist offline   Mit Zitat antworten
Alt 05.05.08, 20:40   #2 (permalink)
Moderator
 
Benutzerbild von Elderan
 
Registriert seit: 30.03.04
Elderan Leistung: 8086
Likes: 14
Standard

Hallo,
die erste Frage: Ist das wirklich notwendig?


Ansonsten würde ich für eine abgeänderte Variante 1 tendieren, stellst erst per count() fest, wieviele Zahlen vorhanden sind.
Ist diese klein genug, nimmst du Möglichkeit 1.

Sollte die Zahl zu groß sein, dann nimm Variante 3.
Dies kann man noch abändern. Du gehst z.B. in 100er Schritten vorwärts, beginnst bei einer zufälligen Zahl x und lässt dir alle Zufallswerte zwischen x und x+100 ausgeben.
Sollte eine Lücke vorhanden sein, wähle diese.
Ansonsten erhöhe x um 100 (modulo 10 000) und beginne von vorne.

Dies lässt sich noch schöner Implementieren, mit einer abgeänderten Variante des binären Suchens:
Du schränkst den Bereich auf z.B. x+1000 ein und ermittelst per count(), wieviele Elemente du hast. Wenn das zufallsfeld indiziert ist, geht das recht schnell.
Sollte count() 1000 liefern, fahre fort wie oben (x + 1000 mod 10k)
Sollte count() < 1000, dann schaue die Differenz an. Sollte diese groß sein, kann man wieder Möglichkeit 1 nehmen, mit einem Zufallswert zwischen x und x+1000.
Wenn diese Diff zu klein ist, überprüfe x und x+500, wieviele freie Zahlen dadrin stehen. Sollte es keine Zahl sein, dann teste x+500 bis x+1000.
Dies kann man dann entsprechend weit einschränken.


Aber dies sind alles keine schönen Lösungen und wahrscheinlich lässt sich dein Problem auch besser lösen.
Elderan ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 05.05.08, 21:04   #3 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

Darf man fragen, wozu das ganze dienen soll (eventuell ist der ganze Ansatz dann überflüssig )

Ansonsten würde ich Lösung 1 bevorzugen, allerdings:
den Seed sowie die Nummer der Zahl (Index der Folge) speichern (ok, könnte man auch durch Select COUNT(spalten) from zufallstabelle usw lösen). Sowie darauf achten, dass die Tabelle nie zu voll wird (Richtwert 75% sollte reichen, kommt von den Hashtabellen"defaultfüllwert", sollte aber genauso gut hier funktionieren). Übertragen auf DB würde das heißen: wenn z.B von 1 bis 100 000 Zufallszahlen generiert werden sollen und schon 75 000 Einträge in der Tabelle vorhanden sein, sollte entweder die Grenze nach oben verschoben werden oder ernsthafte Gedanken darüber gemacht, ob man nicht gleich alles normal durchnummeriert

Wenn eine neue Zufallszahl generiert werden sollte - den Zufallsgenerator mit dem gespeicherten Seedwert initialisieren, erstmal X Werte generieren lassen und ab da die 1. Strategie anwenden. Sofern der Zufallsgenerator mehr oder weniger anständig ist, sollte die Suche nach dem Wert nicht allzulange dauern. Denn der Zufallsgenerator sollte im Nu 10 000 Durchgänge durchlaufen können und anschließend irgendeine Zahl generieren, die noch nicht dran war.
Oder Du achtest allgemein auf den Füllwert (wie gesagt, Richtwert von 75% halte ich für ok, man kann es aber auch leicht nach oben verschieben) - dann dürften auch mit 1. keine Probleme auftreten.
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 05.05.08, 21:07   #4 (permalink)
LX
Moderator
 
Registriert seit: 14.02.06
LX Leistung: Z3
LX eine Nachricht über ICQ schicken LX eine Nachricht über AIM schicken LX eine Nachricht über Yahoo! schicken
Likes: 21
Arrow

Du könntest auch einfach bereits alle Werte in die Datenbank eintragen und als weitere Spalte in der Tabelle ein Flag hinzufügen, ob dieser Wert bereits verwendet wurde. Dann selektierst du einfach auf Werte, bei denen dieses Flag nicht gesetzt ist. Das frisst Speicher, aber ist vermutlich das performanteste. Das entspricht etwa deiner Version 2, kommt aber ohne zweite Tabelle aus (und vereinfacht so die Abfragen und macht es einfacher, das ganze konsistent zu halten).
__________________
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

JS BB LX UP
LX ist offline   Mit Zitat antworten
Alt 07.05.08, 14:24   #5 (permalink)
Themenstarter
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Eydeet Leistung: Facit NTK
Likes: 4
Standard

Es geht bei der ganzen Sache um eine Art Online-Spiel. Jeder Spieler soll am Anfang eine Stadt bekommen, die aber nicht einfach der Reihe nach vergeben werden sollen.
Alternativ zu dem Weg mit den Zufallszahlen ist mir noch ein Weg eingefallen, da die Zahlen eigentlich nicht wirklich streng zufällig sein müssen: (FixPrimzahl * i) mod 10000. Das ist wahrscheinlich für meinen Fall am Sinnvollsten.
Ich werde aber auch mal mit den Zufallszahlen rumexperimentieren, also vielen Dank an euch drei!
Eydeet ist offline   Mit Zitat antworten
Alt 07.05.08, 14:41   #6 (permalink)
Senior Member
 
Registriert seit: 29.07.05
Heinzelotto Leistung: Facit NTK
Heinzelotto eine Nachricht über ICQ schicken
Likes: 0
Standard

such doch einfach zufällig eine stadt aus uns schau, ob sie schon vergeben ist. Zumindest im Anfangsstadium des Spieles, wenn erst wenige Städte vergeben sind, sollte das die effektivste Methode sein.
Heinzelotto ist offline   Mit Zitat antworten
Alt 07.05.08, 16:57   #7 (permalink)
Moderator
 
Benutzerbild von Elderan
 
Registriert seit: 30.03.04
Elderan Leistung: 8086
Likes: 14
Standard

Hallo,
@Eydeet: Den Ansatz hat CDW oben schon beschrieben. Entweder die internen PHP Funktionen benutzen oder selber einen linearen Kongruenzgenerator bauen:
$x = 1103515245*$x + 12345 & 0x7fffffff;
Dann return $x mod 10000;

(siehe hier)


Allerdings solltest du wirklich überlegen, ob du die Zufallszahlen brauchst. Man kann Städte auch inkrementell verteilen und es nur bei der Ausgabe zufällig aussehen lassen, dazu müsste man aber mehr über deine Motivationen wissen
Elderan ist offline   Mit Zitat antworten
Alt 07.05.08, 19:29   #8 (permalink)
Senior Member
 
Registriert seit: 26.03.06
Serow Leistung: 8086
Likes: 16
Standard

Wie wärs wenn du dir aus der DB die Städte holst, die noch nicht vergeben sind und wählst aus der Menge dann eine zufällig aus !?!!?
Serow ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » Zufälligen Wert finden, der nicht in einer Datenbank gespeichert ist
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Umsetzung einer Datenbank für Informationen BigDevil Code Kitchen 11 07.11.07 15:03
Werden Benutzerdaten in einer zip-File gespeichert? RandZ Virenschutz · Tools & Aggressive Software 2 09.08.06 02:59
Ich kann alle im Netzwerk finden, mich kann man auch finden aber nicht zugreifen Strahl Network · LAN, WAN, Firewalls 11 21.07.05 16:52
adresse zu einer tel.-nummer finden?? RedEagle Off topic-Zone 2 27.06.05 21:44
Wert einer Var in VB löschen $oul (In)security allgemein 6 17.06.05 13:48


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61