Angenommen, Sie sprechen über arc4random_uniform
anstelle von arc4random
, da das spätere keine Obergrenze haben Sie können angeben.
Die Antwort lautet: es könnte!
am source and documentation Suche:
Uniformity durch Erzeugen von Zufallszahlen neu, bis die zurück erreicht wird, ist außerhalb des Bereichs [0, 2**32 % upper_bound)
. Diese garantiert die ausgewählte Zufallszahl wird innerhalb [2**32 % upper_bound, 2**32)
sein, die Karten zurück [0, upper_bound) nach der Reduktion modulo upper_bound.
Das bedeutet, dass die Geschwindigkeit der Erzeugung von Zufallszahlen auf dem Verhältnis zwischen der oberen Grenze der arc4random
abhängt und den erwähnten Rest modulo zuvor.
In Ihrem Beispiel:
2^32 % 10 = 4
2^32 % 1000000 = 967.296
eine Zufallszahl erzeugen arc4random()
ein Zeit-Ausbeuten zum Beispiel unter Verwendung von 768.649
, die kleiner ist als der zweite Wert ist. Das bedeutet, dass es für den späteren Fall eine zweite Zufallszahl erstellen müsste, die arc4random()
ein zweites Mal aufruft - der erste Fall ist bereits geschehen, indem Zufallszahlen erzeugt werden.
Aber das Laufzeitdifferenz liegt ganz dem Zufall überlassen.
Ein zweiter Programmlauf möglicherweise Ausbeute 1.316.166.055
auf den ersten Versuch, die beide Aufrufe die gleiche Menge an Zeit verursacht.
Da arc4random
gleichmäßig um die Wahrscheinlichkeit des zweiten verteilten länger dauert etwas nahe an 967.296/2^32
welche 0.00022521615
=> in ~0.02%
der Anrufe der zweite länger als die erste dauert ist.
In dieser Berechnung ignorierte ich die Tatsache, dass die arc4random
theoretisch sogar eine Zahl kleiner als 4
erzeugen kann, die sogar den ersten Aufruf von requery auslösen würde). Aber es sollte Ihnen immer noch ein Verständnis davon vermitteln, wie unwahrscheinlich ein Unterschied sein wird.
Wenn Sie den wahrscheinlich "langsamsten" Anruf erhalten möchten, müssen Sie arc4random_uniform(2^31+1)
ausführen, was eine ca. 50% ige Chance hat, beim ersten Anruf an arc4random
zu scheitern.
Sprechen Sie über 'arc4random_uniform'? 'arc4random' nimmt keine Grenze, soweit ich mich erinnern kann – luk2302
opps ja ich meinte das. Ich werde meine Frage aktualisieren. –