PHP Echte Zufallszahl

So ungern ich das auch tue, diesmal muss ich asdfman Recht geben. Du schreibst fast nur mathematischen Käse.

Dieselbe Wahrscheinlichkeit schließt eine Zufälligkeit jedoch aus, ist also - rein von der Logik her - völlig Sinnbefreit

Das ist einfach mathematischer Unsinn und lässt sich auch nicht schöner ausdrücken. Ich weiß auch ehrlich gesagt gar nicht, wo mit der Erklärung begonnen werden soll. Da dir das Beispiel Münzwurf von asdfman nicht gefallen hat, möchte ich nochmals ein anderes nennen. Denk einmal an einen Würfel. Der hat sechs Seiten. Wirfst du ihn, so bleibt er immer auf irgendeiner Seite liegen. Wirfst du ihn unendlich oft, so wirst du feststellen, dass er auf keiner Seite bevorzugt liegen bleibt, sondern dass er auf jeder Seite gleich häufig liegen bleibt. Die Wahrscheinlichkeit, dass der Würfel auf der ersten, zweiten, dritten, vierten, fünften oder sechsten Seite liegen bleibt, ist also immer identisch. Sie beträgt immer genau ein Sechstel. Und obwohl es immer dieselbe Wahrscheinlichkeit ist, ist es trotz allem immer völlig zufällt, auf welcher Seite der Würfel liegen bleibt.

Alles, was du unter dem oben zitierten Satz geschrieben hast, ist absoluter Quatsch. Es geht nicht darum, dass bei 100 Durchgängen jede Zahl genau einmal vorgekommen ist. Das ist nicht die Definition einer Gleichverteilung. Gleichverteilt bedeutet nur, dass die Wahrscheinlichkeit stets dieselbe ist. Die tatsächliche Verteilung darf ganz anders aussehen.

und bewirken, dass ein bestimmter Zahlenraum zuverlässig verteilt durchgelaufen werden kann.

Siehe oben. Du scheinst nicht zu wissen, was Gleichverteilung bedeutet.

Wo Wahrscheinlichkeiten ins Spiel kommen, gibt es einfach keinen echten Zufall mehr.

Wie habe ich diesen Satz zu verstehen? Mathematisch gibt auch dieser jedenfalls absolut keinen Sinn. Überall gibt es Wahrscheinlichkeiten und trotz allem Zufälle. Denke an das obige Beispiel. Die Wahrscheinlichkeit, dass man eine Eins, Zwei, Drei, Vier, Fünf oder Sechs wirft, ist immer jeweils ein Sechstel. Und dennoch ist es Zufall, welche Zahl letzten Endes geworfen wird. Oder denke ans Lottospielen. Die Wahrscheinlichkeit zu Gewinnen liegt bei 0,0000071511%. Und trotz allem ist das Ziehen der Lottozahlen zufällig.

Ah, und dein Münzenbeispiel stinkt ein wenig, die Chance steht 1:3 und nicht 1:2 - du darfst nicht vergessen, dass die Münze theoretisch auch auf dem Rand stehen bleiben könnte.

Spätestens hier wird deutlich, dass du absolut keine stochastischen Grundlagenkenntnisse hast. 1:3 und 1:2 sind nämlich beide doppelt falsch. Wenn du zwei Möglichkeiten hast, die beide gleichwahrscheinlich auftreten (z. B. Münzwurf ohne Berücksichtigung der Kante), dann hast du keine WS von 1:2, sondern von 1:1. Eine Wahrscheinlichkeit von 1:2 hast du, wenn du drei gleichverteilte Möglichkeiten hast und eine WS von 1:3 hast du, wenn du vier (nicht drei!) gleichverteilte Möglichkeiten hast. Das ist schon einmal der erste Fehler. Der zweite Fehler ist, dass auch 1:2 auf einen Münzwurf mit Kante nicht passt, da das bedeuten würde, dass die drei Möglichkeiten gleichverteilt sind. Da die Kante allerdings so dermaßen unwahrscheinlich ist, hast du auch beim Münzwurf mit Berücksichtigung der Kante nahezu eine WS von 1:1. Und wenn ich dich jetzt Frage, wie groß die WS ist, eine bestimmte Kugel aus 100 zu ziehen, dann sagst du auch hoffentlich 1:99 und eben nicht 1:100. Denn auf 1 gewünschtes Ereignis folgen im Schnitt 99 ungewünschte, nicht 100.

Du hast damit eine extremst hohe Wahrscheinlichkeit, dass du richtig rätst

Eine extremst (ein selbstgemachter Superlativ) hohe Wahrscheinlichkeit? Du hast exakt eine Fifty-fifty-Chance. Ich würde das nicht als „extremst“ hoch bezeichnen. Sag das einmal den ganzen Leuten, die bei Wer-wird-Millionär trotz Fifty-fifty-Joker herausgeflogen sind.
 
Auhmann asdfman... ICH laber wenigstens nich oberschlaumeierhaft herum sondern liefere LÖSUNGSWEGE, die auch NACHVOLLZIEHBAR sind - und bewirken, dass ein bestimmter Zahlenraum zuverlässig verteilt durchgelaufen werden kann.
Dein Lösungsweg ist nachvollziehbar, aber schlecht. Die Gründe habe ich genannt. Wenn man so, wie du es vorschlägst, eine Reihe von Zahlen erzeugt, kann man bei dieser nicht mehr von Zufall sprechen.

Es ist mit PHP eben NICHT ohne Weiteres möglich gleichmäßig verteilte Zufallszahlen aus einem bestimmeten Zahlenraum zu generieren
Ich gehe davon aus, dass das stimmt. Dann kann man nach dem Verfahren, dass ich vorher genannt habe, die Zufallszahlen, die in einem festen Intervall liegen, in ein beliebiges anderes Intervall überführen.

, und es ist auch NICHT möglich mit PHP mal eben einfach so auf /dev/random zurückzugreifen, denn du vergisst, dass diese Möglichkeit zugleich auch ein Sicherheitsrisiko wär (wer auf dev/random zugreifen kann, kann auch auf andre Systemdateien zugreifen) - und schon gar nicht auf jedem xbeliebigen, gut konfiguriertem Webspace möglich sein darf.
Ich sehe nicht, worin ein Sicherheitsrisiko bestünde, wenn man auf diese eine spezielle Datei lesend zugreifen kann. Ein Administrator kann die Zugriffsrechte entsprechend setzen, dass diese Datei gelesen werden kann, aber andere, sicherheitsrelevante Dateien (bspw. /etc/passwd) nicht. Allein die Tatsache, /dev/random auslesen zu können, stellt kein Sicherheitsrisiko dar. Erst wenn die Möglichkeit, diese Datei zu lesen, daher rührt, dass der Administrator grundsätzlich auf die richtige Konfiguration der Zugriffsrechte verzichtet hat, könnte ich dir zustimmen.

Außerdem gehts explizit um gleichmäßig verteilte Zufallszahlen aus einem sehr kleinen Zahlenbereich - ergo ist die Erratbarkeit wohl recht irrelevant, denn wer einen solch kleinen Zahlenraum wählt, muss mit einer Wahrscheinlichkeit von 1:100 damit rechnen, dass jemand die nächste Zahl korrekt errät.
Ja, das ist richtig. Man rät im Durchschnitt in 1% der Fälle richtig. Mal mehr, mal weniger, denn die Ergebnisse sind nicht sicher. Sie sind zufällig und es ist nur eine Wahrscheinlichkeitsverteilung bekannt. Wenn man es so macht, wie du vorschlägst, rät man in 100% der Fälle richtig.

Und da jede Zahl mit der gleichen Wahrscheinlichkeit angezeigt werden soll, brauchste vielleicht 100 Durchgänge beobachten und kannst irgendwann die exakte Zahl vorraussagen (oder vorausberechnen).
Das ist nicht wahr. Selbst wenn man eine Milliarde Durchgänge beobachtet hat, kann man, wenn die Ergebnisse wirklich zufällig sind und in keinem Zusammenhang zueinander stehen, keine Aussage darüber treffen, welche Zahl als nächstes kommen wird.

Wo Wahrscheinlichkeiten ins Spiel kommen, gibt es einfach keinen echten Zufall mehr. Was meinste bitte, wie extremst unsicher dann Sessions wären - bzw. fast schon sind (siehe Heise-Artikel).
Im Gegenteil. Wahrscheinlichkeiten beruhen sehr häufig auf Zufallsexperimenten. Siehe die (ideale) Münze, bei der jede Seite 50% Wahrscheinlichkeit hat, und dennoch das Ergebnis zufällig ist, oder ein (idealer) Würfel, bei dem jede Seite eine Wahrscheinlichkeit von 1/6 hat und auch hier jedes Ergebnis zufällig ist.

Ah, und dein Münzenbeispiel stinkt ein wenig, die Chance steht 1:3 und nicht 1:2 - du darfst nicht vergessen, dass die Münze theoretisch auch auf dem Rand stehen bleiben könnte.
Selbst, wenn man die Möglichkeit, dass die Münze auf dem Rand stehen bleibt nicht vernachlässigt, ist die Wahrscheinlichkeit nicht für jedes Ergebnis 1/3. Du würdest doch nicht annehmen, das bei einer bestimmten Anzahl Würfen die Münze gleich oft auf einer der beiden Seiten wie auf dem Rand liegen bleibt. Bei einer realen Münze wäre die Wahrscheinlichkeit, dass sie auf dem Rand zum stehen kommt, so gering, dass man dieses Ergebnis wohl selbst bei 1000 Würfen nicht ein einziges Mal bekommen würde.

Das Beispiel war natürlich idealisiert, denn eine echte Münze hätte durch Unwucht und kleine Fehler natürlich eine Neigung eher auf einer der beiden Seiten liegen zu bleiben. Darum ging es nun aber überhaupt nicht.

Und die Wahrscheinlichkeit, dass du richtig "rätst", ist verflucht hoch bei dem Beispiel, weil du nur 3 Möglichkeiten hast, wovon eine unwahrscheinlich (aber nicht unmöglich!) ist. Du hast damit eine extremst hohe Wahrscheinlichkeit, dass du richtig rätst - wie immer, wenn eine Wahrscheinlichkeit und/oder nur leicht veränderliche Daten genutzt werden.
Nein. Die Wahrscheinlichkeit, richtig zu raten liegt bei der idealisierten Münze bei jedem Wurf bei genau 50%. Zwei Würfe hintereinander würde man nur noch in 25% der Fälle richtig erraten, bei drei Würfen 12.5% und so weiter. Du siehst, die Wahrscheinlichkeit fällt sehr schnell auf einen so kleinen Wert, dass man vernünftigerweise nicht mehr sagen kann, es wäre leicht, die Reihe von Münzwürfen zu erraten.

Geht man allerdings so vor, wie du vorschlägst, geht das allerdings folgendermaßen von statten:
Beim ersten Mal hat man eine Chance von 50% richtig zu raten. Danach muss laut dir die andere Möglichkeit gewählt werden. Man weiß also genau, was kommen wird. Danach verlangst du, die Reihe zu wiederholen, also weiß man bei jedem folgenden Wert zu 100%, welcher genommen wird.
 
Zuletzt bearbeitet:
Nein, von Stochastik hab ich keinen Schimmer, weil ich son kram auch nicht brauch. Mal abgesehn driftet man hier grad ziemlich ab. Ich sach nur, dass per Wahrscheinlichkeit ausgewählter Zufall kein zufall mehr ist. Wie ihrs dreht und wendet - mir wurscht, Zufall ist nur Zufall, wenn ich wirklich nur zufällig etwas erraten kann, die Wahrscheinlichkeit aber = null ist. Für mich machs Sinn, denn in meinem Leben gibts keinen Zufall. Selbst wenn ich "zufällig" jemanden wieder treffe, den ich jahrelang nicht gesehen habe, ist es dennoch kein Zufall, da vorangegangene Ereignisse dazu führen, dass ich ihn getroffen hab. Zufall ist für mich ein Wert, der unabhängig von äußeren Einflüssen ist. So seh ich es - mir wurscht, ob es technisch oder mathematisch korrekt ist ;) Per Mathematik einen 100%ig zufälligen Wert zu generieren halte ich demnach sowieso für völlig unmöglich, man kann es nur extremst schwierig machen diesen auf seine Basiswerte zurück zu "rechnen". Ist wie mit den Verschlüsselungen MD5, Sha, SSL usw usw usw. Alles nicht unknackbar - kommt lediglich drauf an, wie viel Zeit und Technik man investieren kann. Und überall wo Technik im Spiel ist, sind zufälle sowieso ausgeschlossen, da hier grundsätzlich Mathe im Spiel ist, und Mathe kennt keine Zufälle. Gut, ich war in Mathe eh kein Ass - steinigt mich.

@asdfman

Das ist nicht wahr. Selbst wenn man eine Milliarde Durchgänge beobachtet hat, kann man, wenn die Ergebnisse wirklich zufällig sind und in keinem Zusammenhang zueinander stehen, keine Aussage darüber treffen, welche Zahl als nächstes kommen wird.

Das ist in Sachen PHP sehr wohl wahr. Da brauchste keine Milliarde Abfragen. Oder vielleicht doch, weiß ich nicht. Auf jedenfall kannste, zumindest laut dem Heise-Artikel, potentiell alles errechnen, was scheinbar "zufällig" generiert wurde. Es geht hier halt eben um PHP, nicht um echte Zufallsauswahlen. Lies dir den Heise-Artikel durch und du wirst sehen, dass meine Aussage - bezogen auf PHP - wahr ist. Ich hab an keiner Stelle behauptet, dass es auf andere Sprachen oder Dinge zutrifft ;)

Wie gesagt, er will eine Methode, die dazu führt, dass ein gewisser Zahlenbereich eine gleichmäßig verteilte Wahrscheinlichkeit für die Auswahl aller einzelnen Zahlen erhält und die hab ich geliefert - ich kenne keine Methode über PHP, die es _ohne_ irgendwelche Hilfsmittel und einfach verständlich zum Erfolg führt. rand() und mt_rand() sind dabei unzuverlässig, kann man recht schnell rausfinden, wenn man mal 10.000 Durchgänge generiert und für jede ausgewählte Zahl aufrufe+1 in der Datenbank abspeichert - hab ich selbst mal gemacht, wenn auch mit ner andren Sache als simple Zahlenreihen. Aber hey - heißt nicht, dass es nicht doch eine andere Methode gibt, um das eleganter zu lösen. Weißheit hab ich letztlich auch nicht gefressen^^

Einmal abgesehen davon: man könnte das Zahlenarray nach jedem Durchgang shufflen, das würde zusätzlich Rückschlüsse auf die vergangene und damit zukünftige Anzeigen durchaus erschweren, da der Shufflevorgang die Zahlen immer wieder neu im (assoziativen!) Array positioniert.

Aber ich glaub an der Stelle könne mer die diskussion abbrechen, die hilft dem Hilfesuchenden nicht viel ;)
 
Wie ihrs dreht und wendet - mir wurscht, Zufall ist nur Zufall, wenn ich wirklich nur zufällig etwas erraten kann, die Wahrscheinlichkeit aber = null ist.


Das ist aber einfach unlogisch. Wenn die Wahrscheinlichkeit, dass ein Ereignis auftritt, gleich null ist, so kann es gar nicht auftreten - auch nicht zufällig. Es tritt einfach nie auf. Damit es überhaupt zufällig auftreten kann, muss es eine Eintrittswahrscheinlichkeit größer null haben - zwangsläufig.
So seh ich es - mir wurscht, ob es technisch oder mathematisch korrekt ist

So funktioniert das aber nicht. Wenn man miteinander diskutiert, dann muss man sich an die gängigen Begriffsdefinitionen halten, ansonsten gibt es – wie man hier wieder schön sieht – nur Durcheinander. Man braucht in Diskussionen immer eine gewisse gemeinsame Basis, damit man sich versteht. Es funktioniert einfach nicht, wenn sich jeder seine eigenen Definitionen zurechtlegt. Wenn man über Wahrscheinlichkeiten und Zufälle diskutiert, dann geht es nicht, dass sich jeder seine eigene Definition zusammenbaut, was er unter Zufall oder Wahrscheinlichkeit versteht. Aus mathematischer Sicht ist das alles, was du schreibst, falsch. Aber die Mathematik bildet bei diesem Thema nun mal die gemeinsame Basis. Und daher ist es halt sehr schlecht, wenn ein Teilnehmer sagt, ihm wäre es wurscht, ob das mathematisch korrekt ist. Weil wenn wir uns noch nicht mal darüber einig sind, was wir unter den Begriffen, die wir benutzen, zu verstehen haben, dann sollten wir mit der eigentlichen Diskussion gar nicht erst anfangen.

EDIT:

Wie gesagt, er will eine Methode, die dazu führt, dass ein gewisser Zahlenbereich eine gleichmäßig verteilte Wahrscheinlichkeit für die Auswahl aller einzelnen Zahlen erhält und die hab ich geliefert

Eben gerade nicht. Das ist doch der Punkt, den wir die ganze Zeit versuchen klar zu machen. Das, was du in deinem Post mit dem Array beschrieben hast, ist Käse. Noch einmal: Du hast nicht verstanden, was gleichverteilt bedeutet. Die von dir beschriebene Vorgehensweise erzeugt alles, aber definitiv keine gleichverteilten Zufallszahlen.

EDIT2:

rand() und mt_rand() sind dabei unzuverlässig, kann man recht schnell rausfinden, wenn man mal 10.000 Durchgänge generiert und für jede ausgewählte Zahl aufrufe+1 in der Datenbank abspeichert - hab ich selbst mal gemacht, wenn auch mit ner andren Sache als simple Zahlenreihen.

Generell wäre als mal interessant zu wissen, was der TE vor hat. Denn mt_rand() als unzuverlässig zu bezeichnen, na ja, also für die meisten Aufgaben sollte das absolut ausreichend sein. Im Übrigen sind 10.000 Durchgänge nicht wirklich viel. Ab ein paar Millionen können wir drüber reden. Wie dein Versuch genau aussah, weiß ich natürlich nicht. Aber bei 100 verschiedenen Ereignissen (und erst recht bei noch mehr) wäre 10.000 schon arg wenig.
 
Zuletzt bearbeitet:
TchiboMann schrieb:
Nein, von Stochastik hab ich keinen Schimmer, weil ich son kram auch nicht brauch.
Wenn du von dem, was du sagst, keinen Schimmer hast, warum beharrst du denn so felsenfest darauf, statt einmal die Meinung von Leuten, die da mehr bescheid wissen in Betracht zu ziehen?

Ich sach nur, dass per Wahrscheinlichkeit ausgewählter Zufall kein zufall mehr ist. Wie ihrs dreht und wendet - mir wurscht, Zufall ist nur Zufall, wenn ich wirklich nur zufällig etwas erraten kann, die Wahrscheinlichkeit aber = null ist.
Wenn die Wahrscheinlichkeit für ein Ereignis 0 ist, dann kann es nicht eintreten. Das ist dann kein Zufall mehr, sondern die absolute Gewissheit, dass man dieses Ereignis niemals bekommen wird.

Per Mathematik einen 100%ig zufälligen Wert zu generieren halte ich demnach sowieso für völlig unmöglich, man kann es nur extremst schwierig machen diesen auf seine Basiswerte zurück zu "rechnen"
Lies das Paper über Yarrow. http://www.schneier.com/yarrow.html

Ist wie mit den Verschlüsselungen MD5, Sha, SSL usw usw usw. Alles nicht unknackbar - kommt lediglich drauf an, wie viel Zeit und Technik man investieren kann.
MD5 und die SHA-Familie sind keine Verschlüsselungsalgorithmen, sondern Hashfunktionen. Aufgrund ihres Designs ist es tatsächlich nicht möglich, aus dem Hashwert die ursprünglichen Daten zurückzugewinnen. Lies hier einmal die Spezifikation der Hashalgorithmen, dann wird das offensichtlich. Bei Angriffe auf Hashalgorithmen versucht man "Kollisionen" zu erzeugen. Also zwei Datenströme, die den selben Hashwert liefern. Dazu ist der ursprüngliche Datenstrom entweder bekannt oder man generiert die beiden Ströme selbst so, dass sie den selben Hashwert ergeben. Von der Ausgabe eines Hashverfahrens die ursprünglichen Daten zurückzugewinnen, kann schon bei einfacher logischer Betrachtung nicht elingen, da eine Hashfunktion einen beliebig langen Datenstrom annimmt um daraus einen Hashwert mit fester Länge zu generieren. Hat ein Hashwert eine Länge von beispielsweise 128 Bit, so erhält man, wenn man für 2^128+1 verschiedene Datenströme den korrespondierenden Hashwert errechnen lässt, auf jeden Fall zwei Hashwerte, die identisch sein müssen. Es ist ganz klar, dass es unendlich viele Daten gibt, die den selben Hashwert ergeben. Wenn man also den Hashwert "zurückrechnen" wollte, würde man unendlich viele Ergebnisse bekommen.

Und überall wo Technik im Spiel ist, sind zufälle sowieso ausgeschlossen,
Ein Wort: Quantenmechanik.
da hier grundsätzlich Mathe im Spiel ist, und Mathe kennt keine Zufälle.
Doch. Besonders im Zweig der Stochastik geht es in sehr großem Umfang um Zufallsexperimente.

Gut, ich war in Mathe eh kein Ass - steinigt mich.
Wenn du selbst zugibst, nicht so viel Ahnung zu haben, dann schalte doch einmal einen Gang zurück. Andere wissen halt besser bescheid.

Das ist in Sachen PHP sehr wohl wahr. Da brauchste keine Milliarde Abfragen. Oder vielleicht doch, weiß ich nicht. Auf jedenfall kannste, zumindest laut dem Heise-Artikel, potentiell alles errechnen, was scheinbar "zufällig" generiert wurde. Es geht hier halt eben um PHP, nicht um echte Zufallsauswahlen. Lies dir den Heise-Artikel durch und du wirst sehen, dass meine Aussage - bezogen auf PHP - wahr ist. Ich hab an keiner Stelle behauptet, dass es auf andere Sprachen oder Dinge zutrifft ;)
Wenn die Funktionen, die PHP mitliefert deinen Ansprüchen an Unvorhersehbarkeit nicht gerecht werden, warum nicht eine eigene schreiben. Ein erwiesenermaßen sicheres Verfahren (Yarrow) habe ich ja schon vorgeschlagen. Laut seiner Beschreibung holt sich dieses Verfahren ständig neue Entropie, so dass es keinen Intervall gibt, nach dem sich die Ausgabe von Yarrow wiederholt. Es ist so designt, dass man von der Ausgabe keine Rückschlüsse auf den internen State des PRNG ziehen kann. So ist es auch quasi ausgeschlossen, zukünftige Werte (über die statistisch gegebene Wahrscheinlichkeit hinaus) vorherzusagen. Lies einmal das Paper von der Yarrow Homepage. Dort ist beschrieben, wie man Yarrow designt hat und welche Unzulänglichkeiten älterer Zufallsgeneratoren dabei nicht mehr gegeben sind.

Wie gesagt, er will eine Methode, die dazu führt, dass ein gewisser Zahlenbereich eine gleichmäßig verteilte Wahrscheinlichkeit für die Auswahl aller einzelnen Zahlen erhält und die hab ich geliefert
Nein. Du hast eine Methode geliefert bei der, wenn man einige wenige Werte mitprotokolliert hat, die Wahrscheinlichkeit, beliebig viele weitere Werte vorherzusagen bei 100% liegt. Das ist keine gleichmäßige zufällige Verteilung.

ich kenne keine Methode über PHP, die es _ohne_ irgendwelche Hilfsmittel und einfach verständlich zum Erfolg führt. rand() und mt_rand() sind dabei unzuverlässig, kann man recht schnell rausfinden, wenn man mal 10.000 Durchgänge generiert und für jede ausgewählte Zahl aufrufe+1 in der Datenbank abspeichert - hab ich selbst mal gemacht, wenn auch mit ner andren Sache als simple Zahlenreihen. Aber hey - heißt nicht, dass es nicht doch eine andere Methode gibt, um das eleganter zu lösen. Weißheit hab ich letztlich auch nicht gefressen^^
Wenn keine in PHP integrierte Funktion deinen Anforderungen entspricht, was spricht dagegen (wie bereits gesagt) eine eigene Funktion zu schreiben? Ich nehme doch an, dass PHP eine ausreichend mächtige Sprache ist, um das umzusetzen.

Einmal abgesehen davon: man könnte das Zahlenarray nach jedem Durchgang shufflen, das würde zusätzlich Rückschlüsse auf die vergangene und damit zukünftige Anzeigen durchaus erschweren, da der Shufflevorgang die Zahlen immer wieder neu im (assoziativen!) Array positioniert.
Um das Array zu mischen benötigt man wieder Zufallszahlen. Benutzt man "Zufallszahlen", die nach deiner Methode erzeugt werden, dann sind sie vollständig bekannt, somit auch die Reihenfolge nach dem Mischen.

Aber ich glaub an der Stelle könne mer die diskussion abbrechen, die hilft dem Hilfesuchenden nicht viel ;)
Es geht doch immer noch um das Thema, nach dem der Threadersteller gefragt hat.
 
leute, ich habe diesen thread ganz vergessen, und nun sehe ich, dass eine mathematische Grundsatzdiskussion geführt wird ! Ich bin begeistert ;)

Nun zurück zum Thema:

Mir geht es darum, dass aus einem Pool von 1000 zahlen, die Wahrscheinlichkeit, dass jede zahl einmal auftaucht, besonders hoch ist. Und da empfand ich, mt_rand nicht so gut, bei ca 1000 durchgängen.


Daher werde ich wieder konkreter, kann man nicht selber einen besseren pseudo-zufallszahlen-algorithmus erstellen ? oder ist das zu krass ?

wie wäre z.b der sha1 wert von einer sich ständig ändernen seite, daraus alle buchstaben rausnehmen, und alle zahlen addieren und dann durch 1000 teilen oder so, nur als bsp

lg
 
hemorieder schrieb:
Mir geht es darum, dass aus einem Pool von 1000 zahlen, die Wahrscheinlichkeit, dass jede zahl einmal auftaucht, besonders hoch ist. Und da empfand ich, mt_rand nicht so gut, bei ca 1000 durchgängen.

Hier gilt dasselbe, das ich bereits TchiboMann gesagt habe: Bei 1000 potenziellen Ereignissen gerade einmal 1000 Durchgänge zu machen, ist einfach ein Witz. Das sind viel, viel, viel zu wenige. Es ist absolut nichts Verwunderliches, wenn bei 1000 Durchgängen nicht jede Zahl genau einmal vorgekommen ist. Und selbst wenn eine Zahl ganze zehnmal vorgekommen ist und 100 andere Zahlen dafür gar nicht, so ist auch das kein Grund zur Beunruhigung. Wir reden hier nun einmal nur über Wahrscheinlichkeiten. Die Dinger heißen nun einmal nicht ohne Grund Zufallszahlen, sondern weil hier der Zufall seine Finger im Spiel hat. Und, ich kann mich nur wiederholen, 1000 Durchgänge sind bei 1000 potenziellen Ereignissen absolut nichts. Ich bleibe daher dabei und behaupte, dass mt_rand() für dich völlig ausreichend ist. Wenn du tatsächlich bei 1000 Durchgängen jede Zahl genau einmal haben möchtest, dann kannst du TchiboMann’s Methode verwenden. Mit gleichverteilten Zufallszahlen hat das dann allerdings absolut gar nichts mehr zu tun.

EDIT: Noch eine Analogie: Nimm dir einen (möglichst) idealen Würfel und würfele sechsmal. Fast nie werden immer genau alle 6 Zahlen fallen. Bedeutet das nun, dass die Seiten verschiedene Wahrscheinlichkeiten haben und du einen besseren Würfel brauchst bzw. dir selbst bauen musst? Keineswegs, hier pfuscht uns einfach die Varianz dazwischen.
 
Zuletzt bearbeitet:
@zweipunktnull

Ich hatte damals übrigends bei etwa 10 Zufalls"zahlen" 10.000 durchgänge gemacht, ich denke, das sollte durchaus ausreichen um sich ein Bild davon zu verschaffen, wie regelmäßig jede einzelne "Zahl" auftaucht :rolleyes:

Es geht ihm einfach simpel darum aus einem Pool von Zahlen jede Zahl gleichmäßig in einer zufälligen Reihenfolge zu nutzen. Wo ist das Problem, dies zu verstehen? Das ganze Fachgesimple und das Bestehen auf den Punkt von Stochastik, "echten Zufall", Wahrscheinlichkeiten etc ppn nutzen ihm hier an dieser Stelle nichts, da dies nicht explizit gefordert ist. Mit andren Worten: Es ist offensichtlich völlig irrelevant, ob eine Zahlenfolge womöglich errechnet werden kann, wobei man dann den Ausgangspunkt kennen muss - und bis man da ankommt dauerts eh ne weile.

Außerdem wiederhole ich mich gerne nochmal: Ich habe nie behauptet, dass MEINE Ansicht richtig sein muss - und es is mir schietegal, ob das technisch nun korrekt ist oder nicht, ich hab auch nie gesagt, dass ich eure Interpretationen in Frage stelle, ihr braucht euch also nicht bemühen mich eines besseren zu belehren. Wie gesagt, ich stells an keiner Stelle in Frage.


@hemorieder

Wofür brauchst du diesen Generator eigentlich nun konkret? Ist der Generator abhängig von Sicherheit, soll er einen Zugriff erschweren ("Spambotabfrage") oder irgendwas in diese Richtung?

Einen eigenen Algorhytmus zu schreiben, der _möglichst nahe_ an eine "echte" Zufallsauswahl kommt und dabei die Wahrscheinlichkeit hoch ist, dass möglichst jede Zahl pro Durchlauf 1x vorkommt, ist per PHP zwar mit sicherheit irgendwie machbar - aber abwegig, da es unter Garantie viel Performance schluckt. Aber es kommt halt eben auf den abgezielten Einsatzzweck an, gibt ja performancekritische und unkritische Zwecke.
 
Das

TchiboMann schrieb:
Es geht ihm einfach simpel darum aus einem Pool von Zahlen jede Zahl gleichmäßig in einer zufälligen Reihenfolge zu nutzen.

ist aber absolut nicht äquivalent zu dem

hemorieder schrieb:
ich suche eine wirklich sichere und gleichmäßig verteilte Möglichkeit eine einstellige (also 4, 58, usw) Zufallszahl zwischen 1 und 100 generieren zu lassen.

Wann wirst du endlich akzeptieren, dass eine Gleichverteilung nicht das ist, für das du sie hältst?

Oder anders gefragt, um dem Ganzen irgendwann einmal ein Ende zu setzen: Willst du, hemorieder, gleichverteilte Zufallszahlen aus dem Intervall [1, 100] erzeugen oder willst du, dass bei 100 Ziehungen jede Zahl exakt einmal gezogen wird? Denn diese beiden Dinge sind absolut nicht dasselbe!
 
Zuletzt bearbeitet: (Hervorhebungen zur Unterstützung des Verständnisses vorgekommen!)
@TchiboMann:
Zufallszahlen, wo man sagen kann, dass jede bei einem "Durchlauf" mindestens einmal dran kommen, halte ich für unsinnig... Das entspricht ja dann nicht mehr dem Zufall. Zum Zufall gehört halt auch dazu, dass ein und das selbe Ergebnis mehrmals hintereinander drankommen dürfen - man denke mal ans Würfeln...

Die Wahrscheinlichkeit soll gleichverteilt sein, nicht aber die Ziehungen.

Dass Wahrscheinlichkeiten keine festen Aussagen über den Ausgang eines Zufallsexperiments machen, ist dir schon klar, oder? Ok, es sei denn, es gibt die Wahrscheinlichkeit 1 (bzw 0) dabei... (also Wahrscheinlichkeit, dass beim sechseitigen Würfel mit Seiten von 1 bis 6 eine 7 geworfen wird ist nun mal 0...)
 
Natürlich kann man zufällig Zahlen aus einer Menge wählen und die schon vorgekommenen aus der Menge entfernen und so jede Zahl genau einmal vorkommen lassen. Bloß ändert sich dann nach jedem solchen Durchgang die Wahrscheinlichkeit dass eine bestimmte Zahl ausgewählt wird. Hier ist allerdings nicht danach gefragt, sondern, wie 1668mib schon beschrieb, nach gleicher Wahrscheinlichkeit.
TchiboMann hat wie es scheint kein Interesse sich ernsthaft an der Diskussion zu beteiligen, da er sich weigert diese auf einer gemeinsamen Basis zu führen.
 
Backslash schrieb:
B loß ändert sich dann nach jedem solchen Durchgang die Wahrscheinlichkeit dass eine bestimmte Zahl ausgewählt wird.

Das ist so aber nicht ganz korrekt, du implizierst, dass der Zufallszahlengenerator ein Gedächtnis hat und somit die vorherigen Zufallszahlen die nächsten beeinflussen.
Und dem ist nicht so! Nur weil gerade eine 2 kam ist die Wahrscheinlichkeit, dass gleich wieder eine 2 kommt, nicht kleiner.

Mich würde mal interessieren worin nun im Detail die Probleme mit den Zufallszahlen von mt_rand() bestehen. Denn der Generator ist ziemlich gut, besser gehts dann nur noch, dass er für kryptografische Operationen freigegeben ist (erfüllt bestimmte Eigenschaften).
 
ice-breaker, dein Einwand entspricht leider nicht dem von mir beschriebenen Verfahren.
Selbstverständlich hätte die von mir beschriebene Funktion ein "Gedächtnis", da, wie gesagt "die schon vorgekommenen aus der Menge (entfernt)" werden. Man würde zum Beispiel eine Liste mit der Menge der möglichen Zahlen erstellen und dann die jeweils ausgewählte Zahl aus dieser löschen. Der "Zufallszahlengenerator" würde immer ein Element der Liste auswählen, zum Beispiel indem er den Index des auszuwählenden Elements generiert.

Pseudocode:
Code:
Liste MöglicheWerte = neue Liste({ 1, 2, 3, 4, 5 });

NächsteZufallszahl()
{
    Int GewählterIndex = ZuffallszahlGenerieren(0, Liste.Länge - 1);
    Int GewählteZahl = Liste[GewählterIndex];
    Liste.EntferneElement(GewählterIndex);
    
    return GewählteZahl;
}
 
ja die zufallszahl anhand des unix timestamp kalkulieren lassen, da haste jede sekunde ein anderes nicht vorraussagbares ergebnis
Weil der Timestamp ja absolut nicht vorhersagbar ist :E
 
Eigentlich kann man doch zusammenfassend sagen: PHP bietet zwei Funktionen um Zufallszahlen zu generieren. Wäre es so einfach, eine bessere Funktion zu schreiben, dann stünde diese entweder ganz einfach direkt in PHP zur Verfügung oder jemand hätte so etwas schon mal geschrieben und Google könnte helfen.

Fakt ist, PHP besitzt eben keine weitere Funktion und man findet auch nichts selbstgeschriebenes, was besser funktioniert.

Ergo: man begnügt sich mit rand oder mt_rand ;)
 
Rischtiiisch.

Mehr Aufwand wäre nur für sehr spezielle Zwecke angebracht und ich glaube nicht dass dann die Frage hier im Forum käme ;)
 

Ähnliche Themen

Zurück
Oben