objective c - number - 在Objective-C中生成隨機數




ios random number (9)

//以下示例將生成0到73之間的數字。

int value;
value = (arc4random() % 74);
NSLog(@"random number: %i ", value);

//In order to generate 1 to 73, do the following:
int value1;
value1 = (arc4random() % 73) + 1;
NSLog(@"random number step 2: %i ", value1);

輸出:

  • 隨機數: 72

  • 隨機數字步驟2:52

我主要是Java頭,我想要一種方法來生成0到74之間的偽隨機數。在Java中,我將使用以下方法:

Random.nextInt(74)

我對關於種子或真正的隨機性的討論不感興趣,只是你如何在Objective-C中完成相同的任務。 我搜索了谷歌,似乎有很多不同和相互矛盾的信息。


你應該使用arc4random_uniform()函數。 它使用卓越的算法來進行rand。 你甚至不需要設置種子。

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

arc4random手冊頁:

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))

和C一樣,你會這樣做

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

(假設你的意思是包括0但不包括74,這就是你的Java例子)

編輯: random()rand()替代random()arc4random() rand()就像其他人指出的那樣,它非常糟糕)。


對於遊戲開發使用random()來生成隨機數。 可能至少比使用arc4random()快5倍。 當使用random()的全部範圍生成隨機數時,模偏差不是問題,特別是對於遊戲。 一定要先種子。 在AppDelegate中調用srandomdev()。 這裡有一些幫助功能:

static inline int random_range(int low, int high){ return (random()%(high-low+1))+low;}
static inline CGFloat frandom(){ return (CGFloat)random()/UINT32_C(0x7FFFFFFF);}
static inline CGFloat frandom_range(CGFloat low, CGFloat high){ return (high-low)*frandom()+low;}

從iOS 9和OS X 10.11開始,您可以使用新的GameplayKit類以各種方式生成隨機數。

你有四種源類型可供選擇:一般隨機源(未命名,直到系統選擇它的作用),線性同餘,ARC4和Mersenne Twister。 這些可以產生隨機整數,浮點數和布爾值。

在最簡單的層面上,您可以從系統的內置隨機源生成一個隨機數,如下所示:

NSInteger rand = [[GKRandomSource sharedRandom] nextInt];

這產生-2,147,483,648和2,147,483,647之間的數字。 如果你想要一個介於0和上限(獨占)之間的數字,你可以使用這個:

NSInteger rand6 = [[GKRandomSource sharedRandom] nextIntWithUpperBound:6];

GameplayKit內置了一些便利的構造函數來處理骰子。 例如,你可以像這樣擲出一個六面骰子:

GKRandomDistribution *d6 = [GKRandomDistribution d6];
[d6 nextInt];

另外你可以通過使用GKShuffledDistribution東西來塑造隨機分佈。


我想我可以添加一個我在許多項目中使用的方法。

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

如果我最終在很多文件中使用它,我通常會聲明一個宏

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

例如

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

注意:僅適用於iOS 4.3 / OS X v10.7(Lion)及更高版本


最好使用arc4random_uniform 。 但是,這在iOS 4.3下不可用。 幸運的是,iOS會在運行時綁定這個符號,而不是在編譯時(所以不要使用#if預處理器指令來檢查它是否可用)。

確定arc4random_uniform是否可用的最佳方法是執行如下操作:

#include <stdlib.h>

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

根據rand(3)的手冊頁,隨機函數rand函數族已經過時(3)。 這是由於rand()的低12位經歷循環模式。 要得到一個隨機數,只需使用一個無符號的種子調用srandom()來產生生成器,然後調用random()。 所以,相當於上面的代碼將是

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

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

除非要更改種子,否則只需在程序中調用srandom()一次。 雖然你說你不想討論真正的隨機值,但rand()是一個非常糟糕的隨機數生成器,而random()仍然存在模偏差,因為它會生成一個介於0和RAND_MAX之間的數字。 因此,例如,如果RAND_MAX是3,並且你想要一個介於0和2之間的隨機數,那麼你得到0的概率是1或2的兩倍。


這會給你一個0到47之間的浮點數

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

或者只是簡單

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

下限和上限也可以是負數 。 下面的示例代碼給出了一個介於-35.76和+12.09之間的隨機數字

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

將結果轉換為一個數值數值:

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






random