Ich versuche , eine Zufallszahl zu erzeugen, ist zwischen 0 und 1. Ich halte das Lesen über arc4random()
, aber es gibt keine Informationen über einen Schwimmer von ihm zu bekommen. Wie mache ich das?
ios
c
random
floating-point
arc4random
jini
quelle
quelle
Antworten:
Zufälliger Wert in [0, 1 [ (einschließlich 0, ohne 1):
Ein bisschen mehr Details hier .
Der tatsächliche Bereich ist [0, 0,999999999767169356] , da die Obergrenze (doppelt) 0xFFFFFFFF / 0x100000000 ist.
quelle
ARC4RANDOM_MAX
manuell definiert werden, sondern0x100000000
ist 4294967296 , was istULONG_MAX + 1
. Wo ist dokumentiert, dassarc4random()
das MaximumULONG_MAX
sowieso ist?quelle
drand48
müssen Sie die Antwort nur ein wenig aktualisieren. Ich habe auf NSHipster gelesen , dass sie einmal mit einem Startwert initialisiert werden muss. Die Apple-Dokumentation schlägt außerdem vor, dass es initialisiert werden sollte.double
. Informationen zum Erreichen der besten Präzision finden Sie unter stackoverflow.com/a/34765674/1033581 .Swift 4.2+ finden Sie unter: https://stackoverflow.com/a/50733095/1033581
Nachfolgend finden Sie Empfehlungen zur korrekten Gleichmäßigkeit und optimalen Präzision für ObjC und Swift 4.1.
32 Bit Genauigkeit (Optimal für
Float
)Einheitlicher Zufallswert in [0, 1] (einschließlich 0.0 und 1.0) mit einer Genauigkeit von bis zu 32 Bit:
Obj-C :
Swift :
Es ist optimal für:
Float
(oderFloat32
) mit einer signifikanten Genauigkeit von 24 Bit für seine Mantisse48 Bit Genauigkeit (nicht empfohlen)
Es ist einfach, eine Genauigkeit von 48 Bit zu erreichen
drand48
( diearc4random_buf
unter der Haube verwendet wird ). Aber beachte das drand48 aufgrund der Seed-Anforderung und auch aufgrund der suboptimalen Zufallsgenerierung aller 52 Bits der Doppelmantisse Fehler aufweist .Einheitlicher Zufallswert in [0, 1] , 48 Bit Genauigkeit:
Swift :
64 Bit Genauigkeit (Optimal für
Double
undFloat80
)Einheitlicher Zufallswert in [0, 1] (einschließlich 0.0 und 1.0) mit einer Genauigkeit von bis zu 64 Bit:
Swift verwendet zwei Aufrufe von arc4random:
Swift mit einem Aufruf von arc4random_buf:
Es ist optimal für:
Double
(oderFloat64
) mit einer signifikanten Genauigkeit von 52 Bit für seine MantisseFloat80
mit einer signifikanten Genauigkeit von 64 Bit für seine MantisseAnmerkungen
Vergleiche mit anderen Methoden
Antworten, bei denen der Bereich eine der Grenzen (0 oder 1) ausschließt, leiden wahrscheinlich unter einer Gleichmäßigkeitsverzerrung und sollten vermieden werden.
arc4random()
ist die beste Genauigkeit 1 / 0xFFFFFFFF (UINT32_MAX)arc4random_uniform()
ist die beste Genauigkeit 1 / 0xFFFFFFFE (UINT32_MAX-1)rand()
( heimlich mit arc4random ) ist die beste Genauigkeit 1 / 0x7FFFFFFF (RAND_MAX).random()
( heimlich mit arc4random ) ist die beste Genauigkeit 1 / 0x7FFFFFFF (RAND_MAX).Es ist mathematisch unmöglich besser als 32 - Bit - Präzision mit einem einzigen Anruf zu erzielen
arc4random
,arc4random_uniform
,rand
oderrandom
. Daher sollten unsere über 32-Bit- und 64-Bit-Lösungen die besten sein, die wir erreichen können.quelle
Diese Funktion funktioniert auch für negative Float-Bereiche:
quelle
Min+(Max-Min)*((float)arc4random())/ULONG_MAX
stattdessen. Die(float)
Besetzung ist nur Paranoia.Swift 4.2+
Swift 4.2 bietet native Unterstützung für einen zufälligen Wert in einem Bereich:
Doc:
random(in range: ClosedRange<Float>)
random(in range: Range<Float>)
random(in range: ClosedRange<Double>)
random(in range: Range<Double>)
random(in range: ClosedRange<Float80>)
random(in range: Range<Float80>)
quelle
Der vorherige Beitrag mit der Angabe "rand ()" war falsch. Dies ist der richtige Weg, um rand () zu verwenden.
Dadurch wird eine Zahl zwischen 0 -> 1 erstellt
quelle
Dies ist eine Erweiterung für die Float-Zufallszahl Swift 3.1
quelle
Swift 4.2
Swift 4.2 hat eine native und ziemlich voll funktionsfähige Zufallszahlen-API in die Standardbibliothek aufgenommen. ( Swift Evolution Vorschlag SE-0202 )
Alle Zahlentypen haben die statische Zufallsfunktion (in :) , die den Bereich übernimmt und die Zufallszahl im angegebenen Bereich zurückgibt.
quelle
Verwenden Sie diese Option , um Probleme mit der Obergrenze von arc4random () zu vermeiden.
Beachten Sie, dass dies für MAC_10_7, IPHONE_4_3 und höher gilt.
quelle
upper_bound-1
. Sie hätten jedoch immer noch eine willkürlich niedrige Genauigkeit, die durch Upper_bound verursacht wird. Daher sollten Sie die Upper_bound auf UINT32_MAX erhöhen. Und Sie können noch präziser arbeiten, wenn Siearc4random()*1.0 / UINT32_MAX
statt verwendenarc4random_uniform(UINT32_MAX)*1.0 / (UINT32_MAX-1)
.Wie wäre es mit dieser Operation
((CGFloat)(rand()%100)/100)
?quelle
arc4random
hat einen Bereich bis 0x100000000 (4294967296)Dies ist eine weitere gute Option, um Zufallszahlen zwischen 0 und 1 zu generieren:
quelle
Das ergibt einen zufälligen Float zwischen 0 und 1. Mehr Infos hier
quelle
Standardmäßig wird eine Zufallszahl (float) zwischen 0 und 1 erzeugt.
quelle
rand()
scheint unter iOS nicht zu existieren , und wenn dies der Fall wäre, würde es eine Ganzzahl erzeugen, wie es bei jedem anderen * NIX der Fall ist.rand()
ist Teil von C, das wiederum Teil von Objective-C ist (das in der iOS-Programmierung verwendet wird). C-Funktionen wierand()
auf iOS existieren absolut, werden aberarc4random()
bevorzugt.