PHP rand () ... wahre 50/50 Ergebnisse erhalten?

8

Ich möchte eine Funktion mit zwei verschiedenen Ergebnissen ausführen, aber ich möchte, dass jedes Ergebnis wirklich 50% beträgt. Ich nehme an, Rand (0,1) ist der Weg zu gehen, aber ich bin neugierig, ob das möglicherweise einen vor dem anderen bevorzugen könnte. Was ist der beste Weg, um ein 50/50 Ergebnis zu erhalten?

Danke.

BEARBEITEN: Danke Leute, ich will nicht, dass es zufällig ist, ich möchte, dass das Ergebnis 101010101 nicht 111001101 ist. Vielleicht sollte ich nur eine Datenbank mit der letzten Ausgabe aktualisieren und dann das Gegenteil zurückgeben?

EDIT2: OK Es tut mir leid, mein letzter Beitrag war irreführend. Ich rufe die Funktion nur einmal pro Benutzer auf und weise diesen Wert dem Benutzer als Cookie zu. Ich möchte, dass jeder besuchende Benutzer eine 1 oder eine 0 in der Reihenfolge 1010101 erhält.

    
JD Isaacks 18.03.2009, 14:00
quelle

15 Antworten

2

Abhängig von dem spezifischen Kontext, in dem Sie diese Nummer verwenden werden (z. B. pro Benutzer, Lebensdauer der Anwendung usw.), können Sie sie an einer Reihe von Orten, $ _SESSION, einem Datenbankwert oder wenn der Der Bereich deckt nur die aktuelle Seite ab und Sie können sie direkt im Code dieser Seite speichern.

Eine einfache Möglichkeit, den Wert umzuschalten, ist:

%Vor%

Für einen Datenbankaufruf:

%Vor%

usw. ...

    
John Rasch 18.03.2009, 14:25
quelle
29

in PHP mt_rand() ist ein besserer Zufallszahlengenerator

%Vor%

ist genug und sollte einen ziemlich guten 50/50-Wert erzeugen.

Zitat über mt_rand:

  

Viele Zufallszahlengeneratoren älterer libcs ​​haben zweifelhafte oder unbekannte Eigenschaften und sind langsam. Standardmäßig verwendet PHP den Zufallszahlengenerator libc mit der Funktion rand (). Die Funktion mt_rand () ist ein Drop-In-Ersatz dafür.

     

Es benutzt einen Zufallszahlengenerator mit bekannten Eigenschaften mit dem »Mersenne Twister, der viermal schneller Zufallszahlen erzeugt als die durchschnittliche libc rand ().

Bill hatte eine gute Verbindung zu einem visuellen Beispiel. Ich weiß nicht, was PHP der Benutzer dort für PHP hatte, aber da er den Code enthielt, habe ich ihn auf meinem Server gehostet (Linux mit PHP 5.1.6)

Ólafur Waage 18.03.2009 14:07
quelle
10

Antwort auf die bearbeitete Frage: Wenn Sie ein exaktes Verhältnis von 50% beibehalten möchten, ist Zufälligkeit das letzte, was Sie wollen. Für Ihre Zwecke möchten Sie wahrscheinlich nur jedem neuen Benutzer (kein Cookie entdeckt) eine automatische Nummer aus Ihrer Datenbank zuweisen, dann die gerade Seite des geradzahligen Benutzers und die ungerade Nummer der anderen Seite (wie RobS in einem Kommentar vorgeschlagen hat).

%Vor%

Ursprüngliche Antwort: PHPs rand () - Funktion ist kein besonders guter Pseudozufallszahlengenerator (siehe a Einfaches visuelles Beispiel ). Ich würde stattdessen mt_rand () empfehlen.

    
Bill the Lizard 18.03.2009 14:08
quelle
2

Beide (rand () und mt_rand ()) ergeben eine gute Chance von 50% / 50%.

Hier ist ein Beispiel:

%Vor%

Ergebnisse:

%Vor%

Auf Wunsch des Autors will er eine faire Verteilung. Also versuche so etwas:

%Vor%

Gleichverteilung und ausreichend zufällig. (Vorgeschlagen von Brian)

    
St. John Johnson 18.03.2009 14:10
quelle
1

Laut ist das PHP-Handbuch rand (0,1) der richtige Weg. Aber es hängt alles davon ab, wie gut der Zufallsgenerator ist.

    
RobS 18.03.2009 14:05
quelle
1

Nichts ist wirklich 50/50. Wenn Sie 50/50 wollen, dann machen Sie die Funktion so, dass die ersten 5 Ergebnisse 1 und die anderen 5 2 usw. sind.

rand ist für die Generierung von Zufallszahlen gedacht. Das bedeutet, dass es 10-mal das gleiche Ergebnis in einer Reihe geben kann, aber hey das ist zufällig.

    
RvdK 18.03.2009 14:05
quelle
1

Disclaimer: Dies ist eine blöde Sache für Ihr spezielles Problem, aber wenn Sie darauf bestehen, Ihren Zufallsgenerator zu misstrauen, um gleichmäßig verteilt zu werden ...

Der klassische Algorithmus zum Generieren eines 50/50 Ergebnisses, wenn Sie nicht darauf vertrauen, dass Ihr Generator gleichmäßig verteilt ist, ist der folgende Algorithmus. Beachten Sie, dass dieser Algorithmus eher dazu gedacht ist, Zufallszahlen als Pseudozufallszahlen zu fixieren, und dass er die Mod-basierten Ergebnisse tatsächlich verschlechtern kann:

  1. Erzeuge zwei zufällige Bits A und B.
  2. Wenn A == B, gehe zu 1
  3. Zurück B

Sie können auch eine gleichmäßige Verteilung garantieren, indem Sie einfach mit vielen 1s und 0s (gleichmäßig verteilt) beginnen und sie zufällig mischen.

    
Brian 18.03.2009 14:12
quelle
1

RobS hat eine gute Lösung in den Kommentaren, die im Grunde sagen, dass jeder Benutzer eine fortlaufende Nummer bekommen kann. Wenn Sie dann diese Zahl% 2 verwenden, erhalten Sie entweder eine 0 oder eine 1, die bestimmt, welche Seite geliefert wird. Natürlich ist auch das nicht absolut garantiert, um genau ein 50/50 Verhältnis zu geben ... es könnte eine ungerade Anzahl von Leuten sein!

Je nachdem, wie Sie die Nutzer bestimmen, kann es sich auch lohnen, zu überprüfen, dass es keine Korrelation gibt, die auch Menschen mit geraden Zahlen eher zum Kauf verleiten würde ... unwahrscheinlich, aber nur etwas, das Sie im Auge behalten sollten.

Es gibt eine alternative Lösung für Sie, bei der Sie sich keine Sorgen über ungewöhnliche unerwartete Korrelationen machen müssen: basierend auf Ihren Kommentaren und der modifizierten Frage versuchen Sie nur einen fairen Analysevergleich zwischen zwei verschiedenen Seitenlayouts zu erhalten Sie können einfach jeden Seitenlayout-Umsatz nach der Anzahl der zufälligen Aufteilungen aufteilen. dh Sie verwenden Ihren Zufallszahlengenerator und verfolgen, wie oft es 0 gibt, um Seite A zu liefern, und wie oft es 1 gibt, um Seite B zu servieren.

Nehmen wir an, Sie haben auf der Seite A mit 43 Treffern und auf der Seite B mit 46 Treffern 46.000 USD Umsatz gemacht, Sie machen einfach die Rechnung ...

%Vor%

Geben Sie Seite B den leichten Vorteil.

    
Beska 18.03.2009 14:40
quelle
0

vielleicht können Sie versuchen mt_rand (0,1) anstatt rand (0,1)

    
andi 18.03.2009 14:10
quelle
0

Pseudozufälligkeit kann niemals wahre Zufälligkeit sein. Jede Berechnung von Zufallszahlen, die auf einem Seed oder auf andere Weise basiert, hat ein gewisses Maß an Vorbestimmung, das auf eine naheliegende Weise entstehen kann oder auch nicht - wie etwa Mini-Muster. Das Beste, auf das Sie hoffen können, ist fast 50/50.

    
karim79 18.03.2009 14:10
quelle
0

Während es ein Pseudo-Zufallsgenerator ist, wird es nie 50/50 erreichen ... lese etw. über Zufallszahlengeneratoren hier: Ссылка

    
Tobias 18.03.2009 14:12
quelle
0

Wenn Sie nur zwischen 1 und 0 wechseln möchten:

%Vor%     
garyLynch 18.03.2009 14:24
quelle
0

Wenn Sie ernsthaft möchten, dass es bei jeder Iteration den entgegengesetzten Wert zurückgibt ...

%Vor%

, die wahr, falsch, wahr, falsch, wahr etc. zurückgeben sollte.

Das funktioniert natürlich nur, wenn der PHP-Interpreter zwischen den Anrufen im Speicher bleibt.

Wenn Sie nicht wissen, was das statische Schlüsselwort ist, sehen Sie sich den PHP-Handbucheintrag auf variabler Bereich .

    
Powerlord 18.03.2009 14:25
quelle
0

Diese 10101010 ist nicht zufällig, es ist ein Muster.
Ergebnis = nicht Ergebnis

    
dbasnett 18.03.2009 14:27
quelle
0

Dies ist eine Antwort auf Ihren Kommentar zu Ihrem ursprünglichen Beitrag:

Ihr Ziel ist es zu sehen, welche Version der Seite mehr Verkäufe generiert.

Es macht mehr Sinn, jede Seite zufällig einem Besucher zu zeigen, als ABABAB für jeden nachfolgenden Besucher umzudrehen.

Ich kann mir keinen Grund für eine systematische Verzerrung Ihrer Methode vorstellen, aber Sie können es nicht ausschließen. (weithergehendes Szenario: ein Tracking-Bot "folgt" den Benutzern auf Ihre Seite, und so erhält Benutzer 1 A, Bot bekommt B, Benutzer 2 bekommt A, Bot bekommt B usw.).

Bessere Zufälligkeit zu erzielen ist bei einer Studie, wie Sie es tun, sinnvoller, als dafür zu sorgen, dass jede Seite genau in 50% der Fälle angezeigt wird.

    
Baltimark 18.03.2009 14:38
quelle

Tags und Links