随机数生成

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()每次返回不同的值序列,那么调试程序会有多难。 - Martin York
请注意,由rand()生成的随机数并非真正随机的。在大多数情况下,它们是可以接受的,但如果您需要真正的随机数,则需要另一个随机数生成器。许多关于此方面的帖子在SO和Google上,这里是其中之一:https://dev59.com/IXNA5IYBdhLWcg3wNrEy - John Dibling
@martin:这是我项目的要求。 - Chandan Shetty SP
不是你的应用程序必须每次产生不同的随机序列。调试一个每次运行时都有不同行为的程序是不可能的(因为你不知道输入是什么,因此你不知道程序的反应)。现在,如果一个完全功能的程序能够设置为生成唯一的序列,那就很好了。所以你应该这样做:time = time(NULL); Log(time); srand(time); 然后,如果程序崩溃或做了一些愚蠢的事情,你已经记录了起始点,可以重现问题。 - Martin York
@martin:我理解你的意思,这是一个游戏项目——岩石是移动汽车的障碍物,我使用随机数来放置岩石……所以每次用户玩游戏时,岩石必须在不同的位置,这是要求。 - Chandan Shetty SP
6个回答

11

比如,可以执行srand(time(NULL))这样的操作,即将其与时间同步(当然,在程序初始化时执行)。


7
作为说明,请将此内容作为您的申请的第一行。您只需要调用它一次。 - Bill Lynch

4

如前所述, 您必须使用种子初始化随机数生成器。

此外,您应该避免使用循环:

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

3
你需要为随机数生成器提供种子。
从手册中可以看到:
srand()函数使用参数作为新序列的种子,以便在后续调用rand()时返回伪随机数。如果使用相同的种子值再次调用srand(),则伪随机数序列将重复。如果在进行任何srand()调用之前调用rand(),则生成与首次使用种子值1调用srand()时相同的序列。

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;

-1
除了使用srand()来种子化随机数生成器之外,您的一般技术并不完全正确。首先,您永远不应该使用模数来切割rand范围。这会使用较不随机的低位比特。其次,没有必要循环。您可以直接获得范围。以下是如何执行此操作:
snowSize = min + (int) (max * (rand() / (RAND_MAX + 1.0)));

这里不需要浮点数。 - Danvil
不,他不是。random和srandom函数是那些具有更随机外观的低位序列的函数。从random(3)的手册中可以看到:“rand(3)生成的序列要少得多随机--实际上,由rand生成的低十几位经过一个循环序列”。 - JeremyP
你是在和我说话还是他?这个例子使用了rand(3),因此不应该使用%符号,你同意我的观点吗? - frankc
如果max接近2的幂,则仅使用低位比特。但我认为您的计算更加健壮。 - President James K. Polk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接