我使用下面的代码生成范围内的随机数...
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));
如果我退出应用程序并重新启动,则会生成相同的数字集。如何为每次启动生成不同的随机数集。
答案 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)));