2010-04-23 163 views
4

我使用下面的代碼來生成範圍的隨機數...隨機數產生

int randomNumberWithinRange(int min,int max) 
{ 
     int snowSize = 0; 
     do 
     { 
      snowSize = rand()%max; 
     } 
     while(snowSize < min || snowSize > max); 
     return snowSize; 
    } 

for(int i = 0; i < 10 ; i++) 
    NSlog("@"%d",\t", randomNumberWithinRange(1,100)); 

如果我放棄了我的應用程序並重新啓動,產生相同的一組數字。如何爲每次啓動生成不同組的隨機數字。

+2

想一想,如果rand()每次都返回不同的值序列,那麼調試程序將會是多麼困難。 – 2010-04-23 14:56:58

+0

請注意,由rand()生成的隨機數不是真正的隨機數。在大多數情況下,它們都很好,但如果您需要*真正的*隨機數,則需要另一個隨機數生成器。許多職位上SO和谷歌關於此,這裏是一個:http://stackoverflow.com/questions/1046714/what-is-a-good-random-number-generator-for-a-game – 2010-04-23 14:58:32

+0

@馬丁:這是我的項目的要求。 – 2010-04-23 15:02:54

回答

11

做一些事情,例如srand(time(NULL)),即與時間同步(當然在程序的初始化過程中)。

+7

作爲一個說明,只是讓這個應用程序的第一道防線。你只需要調用一次。 – 2010-04-23 14:51:02

3

您需要種子的隨機數發生器。

從手冊頁:

的函數srand()函數使用參數 作爲 僞隨機數的新序列的種子的後續調用返回 到蘭特()。如果 srand()然後用相同的 種子值調用,則僞隨機數字序列 應重複 。如果蘭特()之前 任何呼叫調用函數srand()進行,該 相同的順序應按 生成srand時()首先調用的1

4

一個 種子值你必須用指定的種子初始化隨機數發生器。

另外,你應該避免循環:

int randomNumberWithinRange(int min,int max) 
{ 
    return min + rand() % (max - min + 1); 
} 
+0

特別是因爲他的代碼是錯誤的 – 2011-12-20 18:58:39

-1

除了播種用函數srand隨機數發生器(),在這裏你的一般技術是不完全正確。首先你不應該使用模數來削減蘭德範圍。這個用戶的低階比特不那麼隨機。其次,沒有必要循環。你可以直接得到範圍。這裏是如何做到這一點:

snowSize = min +(int)(max *(rand()/(RAND_MAX + 1.0)));

+0

浮標是沒有必要在這裏。 – Danvil 2010-04-23 15:07:03

+0

你完全錯了。閱讀rand的手冊頁。 – frankc 2010-04-23 15:09:04

+0

不,他不是。隨機函數和隨機函數是具有更隨機的低位序列的函數。從隨機手冊頁(3):「rand(3)產生一個非常少的隨機序列 - 實際上由rand產生的低十位通過一個循環序列」。 – JeremyP 2010-04-23 15:20:45

3

您應該考慮使用arc4random而不是rand,原因很多,其中之一是arc4random不需要播種。

0

此代碼生成一次獨特的隨機數。

#include <ctime> 
# include <iostream> 
using namespace std; 


int main() 
{ 

     int size=100; 
     int random_once[100]; 
     srand(time(0)); 

     for (int i=0;i<size;i++) // generate unique random number only once 
     { 
      random_once[i]=rand() % size; 
      for(int j=0;j<i;j++) if (random_once[j]==random_once[i]) i--; 
     } 

     for (i=0;i<size;i++) cout<<" "<<random_once[i]<<"\t"; 

    return 0;