2016-05-13 30 views
2

Hallo, ich bin neu in der Programmierung hier und ich bin neugierig, wenn ein größerer Limit-Nummer-Generator dazu führt, dass es langsamer beim Generieren einer Zufallszahl ist? Zum Beispiel:Reduziert eine größere Anzahl an Arc4Random die Ladegeschwindigkeit?

die man eine Zufallszahl schneller erzeugt?

arc4random_uniform(1000000) 

oder

arc4random_uniform(10) 

Könnte es die gleiche Geschwindigkeit sein?

Danke!

+0

Sprechen Sie über 'arc4random_uniform'? 'arc4random' nimmt keine Grenze, soweit ich mich erinnern kann – luk2302

+0

opps ja ich meinte das. Ich werde meine Frage aktualisieren. –

Antwort

3

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.

+0

Wow, das ist eine perfekte Erklärung! Ich konnte diese spezifische Apple-Dokumentation nicht verstehen, aber Ihre Beispiele haben es viel leichter verständlich gemacht. Vielen Dank! –