2010-04-23 168 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;