754 Stimmen

Generierung von Zufallszahlen in Objective-C

Ich bin hauptsächlich ein Java-Kopf, und ich möchte eine Möglichkeit, eine Pseudo-Zufallszahl zwischen 0 und 74 zu erzeugen. In Java würde ich die Methode verwenden:

Random.nextInt(74)

Ich bin nicht an einer Diskussion über Seeds oder echte Zufälligkeit interessiert, sondern nur daran, wie man dieselbe Aufgabe in Objective-C bewältigen kann. Ich habe Google durchforstet, und es scheint nur viele verschiedene und widersprüchliche Informationen zu geben.

37voto

Michael Buckley Punkte 4035

Laut der Handbuchseite für rand(3) wurde die rand-Familie durch random(3) überflüssig. Dies ist darauf zurückzuführen, dass die unteren 12 Bits von rand() ein zyklisches Muster durchlaufen. Um eine Zufallszahl zu erhalten, müssen Sie den Generator einfach durch den Aufruf von srandom() mit einem vorzeichenlosen Seed setzen und dann random() aufrufen. Die Entsprechung des obigen Codes wäre also

#import <stdlib.h>
#import <time.h>

srandom(time(NULL));
random() % 74;

Sie brauchen srandom() nur einmal in Ihrem Programm aufzurufen, es sei denn, Sie wollen Ihren Seed ändern. Obwohl Sie sagten, Sie wollten keine Diskussion über echte Zufallswerte, ist rand() ein ziemlich schlechter Zufallszahlengenerator, und random() leidet immer noch unter Modulo-Bias, da es eine Zahl zwischen 0 und RAND_MAX erzeugt. Wenn z.B. RAND_MAX 3 ist und Sie eine Zufallszahl zwischen 0 und 2 wollen, ist die Wahrscheinlichkeit, dass Sie eine 0 erhalten, doppelt so hoch wie bei einer 1 oder 2.

31voto

AW101 Punkte 1610

Besser zu verwenden arc4random_uniform . Dies ist jedoch nicht unter iOS 4.3 verfügbar. Glücklicherweise bindet iOS dieses Symbol zur Laufzeit, nicht zur Kompilierzeit (verwenden Sie also nicht die #if-Präprozessordirektive, um zu prüfen, ob es verfügbar ist).

Der beste Weg, um festzustellen, ob arc4random_uniform zur Verfügung steht, ist es, etwas wie dies zu tun:

#include <stdlib.h>

int r = 0;
if (arc4random_uniform != NULL)
    r = arc4random_uniform (74);
else
    r = (arc4random() % 74);

14voto

Eli Punkte 4714

Ich habe meine eigene Zufallszahlen-Utility-Klasse geschrieben, damit ich etwas habe, das ein bisschen mehr wie Math.random() in Java funktioniert. Sie hat nur zwei Funktionen, und alles ist in C geschrieben.

Header-Datei:

//Random.h
void initRandomSeed(long firstSeed);
float nextRandomFloat();

Implementierungsdatei:

//Random.m
static unsigned long seed;

void initRandomSeed(long firstSeed)
{ 
    seed = firstSeed;
}

float nextRandomFloat()
{
    return (((seed= 1664525*seed + 1013904223)>>16) / (float)0x10000);
}

Das ist eine ziemlich klassische Art, Pseudo-Randoms zu erzeugen. In meiner App Delegate rufe ich auf:

#import "Random.h"

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    initRandomSeed( (long) [[NSDate date] timeIntervalSince1970] );
    //Do other initialization junk.
}

Später sage ich dann einfach:

float myRandomNumber = nextRandomFloat() * 74;

Beachten Sie, dass diese Methode eine Zufallszahl zwischen 0,0f (einschließlich) und 1,0f (ausschließlich) zurückgibt.

7voto

Tom Howard Punkte 4176

Es gibt bereits einige großartige, gut formulierte Antworten, aber in der Frage wird nach einer beliebigen Zahl zwischen 0 und 74 gefragt. Verwenden:

arc4random_uniform(75)

4voto

adijazz91 Punkte 304

Erzeugt eine Zufallszahl zwischen 0 und 99:

int x = arc4random()%100;

Generieren Sie eine Zufallszahl zwischen 500 und 1000:

int x = (arc4random()%501) + 500;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X