随机数生成

时间:2010-04-23 14:49:04

标签: c++ iphone random

我使用下面的代码生成范围内的随机数...

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

如果我退出应用程序并重新启动,则会生成相同的数字集。如何为每次启动生成不同的随机数集。

6 个答案:

答案 0 :(得分:11)

执行类似srand(time(NULL))之类的操作,即将其与时间同步(当然,在程序初始化时)。

答案 1 :(得分:4)

您必须使用指出的种子初始化随机数生成器。

另外你应该避免循环:

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

答案 2 :(得分:3)

您需要为随机数生成器播种。

从手册页:

  

srand()函数使用参数   作为新序列的种子   要返回的伪随机数   随后调用rand()。如果   然后用相同的方式调用srand()   种子价值,序列   伪随机数应为   重复。如果之前调用了rand()   任何对srand()的调用都是由   相同的序列应生成为   首次使用a调用srand()时   种子价值为1。

答案 3 :(得分:3)

您应该考虑使用arc4random代替rand,原因有很多,其中一个arc4random不需要播种。

答案 4 :(得分: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;

答案 5 :(得分:-1)

除了使用srand()播种随机数生成器之外,这里的一般技术还不太对。首先,你不应该使用模数来削减兰特范围。这用户较低的比特随机性较低。其次,没有必要循环。您可以直接获得范围。以下是如何做到这一点:

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