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.

1036voto

lajos Punkte 25175

Sie sollten die arc4random_uniform() Funktion. Sie verwendet einen überlegenen Algorithmus, um rand . Sie müssen nicht einmal einen Samen setzen.

#include <stdlib.h>
// ...
// ...
int r = arc4random_uniform(74);

El arc4random man-Seite:

NAME
     arc4random, arc4random_stir, arc4random_addrandom -- arc4 random number generator

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <stdlib.h>

     u_int32_t
     arc4random(void);

     void
     arc4random_stir(void);

     void
     arc4random_addrandom(unsigned char *dat, int datlen);

DESCRIPTION
     The arc4random() function uses the key stream generator employed by the arc4 cipher, which uses 8*8 8
     bit S-Boxes.  The S-Boxes can be in about (2**1700) states.  The arc4random() function returns pseudo-
     random numbers in the range of 0 to (2**32)-1, and therefore has twice the range of rand(3) and
     random(3).

     The arc4random_stir() function reads data from /dev/urandom and uses it to permute the S-Boxes via
     arc4random_addrandom().

     There is no need to call arc4random_stir() before using arc4random(), since arc4random() automatically
     initializes itself.

EXAMPLES
     The following produces a drop-in replacement for the traditional rand() and random() functions using
     arc4random():

           #define foo4random() (arc4random() % ((unsigned)RAND_MAX + 1))

429voto

yood Punkte 6580

Verwenden Sie die arc4random_uniform(upper_bound) Funktion, um eine Zufallszahl innerhalb eines Bereichs zu erzeugen. Die folgende Funktion erzeugt eine Zahl zwischen 0 und 73 einschließlich.

arc4random_uniform(74)

arc4random_uniform(upper_bound) vermeidet Modulo-Bias wie in der Manpage beschrieben:

arc4random_uniform() gibt eine gleichmäßig verteilte Zufallszahl zurück, die kleiner als die Obergrenze ist. arc4random_uniform() ist gegenüber Konstruktionen wie ``arc4random() % Obergrenze'' zu empfehlen, da es die " Modulo-Bias ", wenn die obere Grenze keine Zweierpotenz ist.

65voto

Genau wie bei C würden Sie Folgendes tun

#include <time.h>
#include <stdlib.h>
...
srand(time(NULL));
int r = rand() % 74;

(vorausgesetzt, Sie meinten 0 einschließen, aber 74 ausschließen, was in Ihrem Java-Beispiel der Fall ist)

Bearbeiten: Sie können Folgendes ersetzen random() o arc4random() para rand() (was, wie andere schon gesagt haben, ziemlich ätzend ist).

51voto

Groot Punkte 13172

Ich dachte, ich könnte eine Methode hinzufügen, die ich bei vielen Projekten anwende.

- (NSInteger)randomValueBetween:(NSInteger)min and:(NSInteger)max {
    return (NSInteger)(min + arc4random_uniform(max - min + 1));
}

Wenn ich es in vielen Dateien verwende, deklariere ich normalerweise ein Makro als

#define RAND_FROM_TO(min, max) (min + arc4random_uniform(max - min + 1))

z.B.

NSInteger myInteger = RAND_FROM_TO(0, 74) // 0, 1, 2,..., 73, 74

Hinweis: Nur für iOS 4.3/OS X v10.7 (Lion) und höher

44voto

Tibidabo Punkte 21133

Dadurch erhalten Sie eine Fließkomma Zahl zwischen 0 und 47

float low_bound = 0;      
float high_bound = 47;
float rndValue = (((float)arc4random()/0x100000000)*(high_bound-low_bound)+low_bound);

Oder einfach nur

float rndValue = (((float)arc4random()/0x100000000)*47);

Sowohl untere als auch obere Schranke können sein negativ auch. Der folgende Beispielcode liefert Ihnen eine Zufallszahl zwischen -35,76 und +12,09

float low_bound = -35.76;      
float high_bound = 12.09;
float rndValue = (((float)arc4random()/0x100000000)*(high_bound-low_bound)+low_bound);

Ergebnis in einen Rundungswert umwandeln Integer Wert:

int intRndValue = (int)(rndValue + 0.5);

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