2010-08-04 8 views
32

Ich versuche in Objective-C einen zufälligen Float zwischen 0,15 und 0,3 zu erstellen. Der folgende Code gibt immer 1:Wie erstellt man ein zufälliges Float in Objective-C?

int randn = (random() % 15)+15; 
float pscale = (float)randn/100; 

Was mache ich falsch?

+0

dieser Code scheint zu arbeiten, immer noch mit 100.0f ist besser. Der einzige Fall, den ich erraten kann, ist, dass Sie diesen Code in eine Funktion einfügen und nicht in .h deklarieren, damit der Compiler den Code auf Double upgraden kann. – chunkyguy

Antwort

17

Versuchen Sie folgendes:

(float)rand()/RAND_MAX 

Oder man zwischen 0 und 5 zu erhalten:

float randomNum = ((float)rand()/RAND_MAX) * 5; 

Mehrere Möglichkeiten, das Gleiche zu tun.

+19

Das ist falsch. 'random()/RAND_MAX' wird Ihnen keinen Gleitkommawert geben, da keiner der Werte ein Fließkommawert ist. Auch die Domäne von 'random()' ist nicht 0 zu RAND_MAX. Die Domäne von 'rand()' und 'rand_r()' ist. Sie sollten also Folgendes verwenden: '(float) rand()/RAND_MAX', um das erwartete Ergebnis zu erhalten. –

+1

Das ist falsch (rand()/RAND_MAX) gibt Ihnen eine Null. Jonathans Kommentar ist wahr. – Gorky

+18

Sie wissen, dass Sie Antworten bearbeiten können, richtig? – hasen

4
  1. Verwendung arc4random() oder Samen Ihre Zufallswerte
  2. versuchen

    float pscale = ((float)randn)/100.0f; 
    
3

Ihr Code funktioniert für mich, erzeugt es eine Zufallszahl zwischen 0,15 und 0,3 (vorausgesetzt, ich Saatgut mit srandom()). Haben Sie vor dem ersten Anruf srandom() an random() angerufen? Sie müssen srandom() mit einem entropischen Wert bereitstellen (viele Leute verwenden einfach srandom(time(NULL))).

Für ernstere Zufallszahlengenerierung, schauen Sie in arc4random, die für kryptografische Zwecke verwendet wird. Diese Zufallszahlenfunktion gibt auch einen Integer-Typ zurück, sodass Sie das Ergebnis weiterhin in einen Gleitkommatyp umwandeln müssen. Hier

63

ist eine Funktion

- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber { 
float diff = bigNumber - smallNumber; 
return (((float) (arc4random() % ((unsigned)RAND_MAX + 1))/RAND_MAX) * diff) + smallNumber; 
} 
+13

#define boris_random (smallNumber, bigNumber) (((float) (arc4random()% ((unsigniert) RAND_MAX + 1))/RAND_MAX) * (bigNumber - smallNumber)) + smallNumber) – chunkyguy

+0

@chunkyguy, Könnten Sie bitte umschreiben diese Antwort mit 'arc4random_uniform'? –

0

Mit srandom() und rand() ist unsicher, wenn Sie wahre Randomisierung mit einigen Schwimmer Salz benötigen.

Auf MAC_10_7, IPHONE_4_3 und höher können Sie arc4random_uniform (outer_bound) * verwenden. Es ermöglicht die Erzeugung einer echten zufälligen Ganzzahl von Null bis * Oberer_Band *.

So können Sie versuchen, die folgende

u_int32_t upper_bound = <some big enough integer>; 

float r = 0.3 * (0.5 + arc4random_uniform(upper_bound)*1.0/upper_bound/2); 
-5

I ended auf ganze Zahlen eine für die tatsächliche ganze Zahl zu erzeugen und dann eine ganze Zahl für das Dezimalsystem. Dann habe ich sie in einem String kommen dann habe ich es zu einem floatvalue mit dem „floatvalue“ Funktion analysieren ... Ich hätte keinen besseren Weg finden, und das funktioniert für meine Absichten, hoffe, es hilft :)

int integervalue = arc4random() % 2; 
int decimalvalue = arc4random() % 9; 
NSString *floatString = [NSString stringWithFormat:@"%d.%d",integervalue,decimalvalue]; 
float randomFloat = [floatString floatValue]; 
+1

Dies ist eine erstaunlich komplizierte Art und Weise, eine einfache Sache zu tun, und es ist nicht einmal richtig. (Zum Beispiel könnte es '1.01' niemals erzeugen.) –

2

Am einfachsten.

+ (float)randomNumberBetween:(float)min maxNumber:(float)max 
{ 
    return min + arc4random_uniform(max - min + 1); 
} 
+1

' arc4random_uniform' erzeugt eine zufällige Ganzzahl. – Andy

0

Hinzufügen zu @ Caladain Antwort, wenn Sie die Lösung so einfach sein wollen als rand() verwenden, können Sie definieren diese:

#define randf() ((CGFloat)rand()/RAND_MAX) 
#define randf_scaled(scale) (((CGFloat)rand()/RAND_MAX) * scale) 

Fühlen Sie sich frei CGFloat zu ersetzen mit double, wenn Sie don habe keinen Zugang zu CoreGraphics.

Verwandte Themen