关于简单随机数生成问题的建议。

时间:2011-07-28 18:54:25

标签: c++ random

我有一个简单的整数向量,只有4个值。我想循环遍历向量,为每个值分配0或1。我希望它是随机的,每次都不同。

我认为以下就足够了:

  for (int i = 0; i < (int)numberVect.size(); i++)
  {
      numberVect[i] = rand() % 2;
  }

但是,我发现每次关闭并重新打开程序时,都会分配完全相同的值。

所以第一次通过它将是1,0,0,0,那么如果我再次运行循环而不关闭程序,它将是0,1,0,1。这看起来很完美。

然而,在关闭程序并重新启动之后,我会发现第一个序列将再次为1,0,0,0,第二个序列将再次为0,1,0,1。


此外,我还有第二个问题与此问题有关:

你能建议一种方法来确保向量中的至少一个值是1吗?同时仍然允许随机生成无缝地工作?

非常感谢,我希望你们能提供帮助:D

7 个答案:

答案 0 :(得分:6)

问题1

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

生成的伪随机数序列取决于种子值(因此可以用相同的种子值重现)。我使用当前时间作为种子值:

srand(time(NULL));

问题2

只有16种可能的序列供您选择(4位)。

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

在这些中,您想要随机选择至少1高位的一个。因此,您只需要随机选择1到15之间的数字,然后将其转换为二进制数!

有两种方法可以做到这一点:

方法1:

int R = rand() % 15 + 1;

方法2:

float r = static_cast<float>(rand())/RAND_MAX;
int R = static_cast<int>( ceil(1 + (15-1)*r) );

获得Rconvert it to binary后。这是一个方法1的示例程序:

// Seed the random number generator
srand(static_cast<unsigned int>(time(NULL)));

// Get the random number from 1 - 15
int R = (rand()%15)+1;
cout<<R<<endl;

// Convert to binary
vector<int> numberVect(4);  
for (int i = static_cast<int>(numberVect.size())-1; i >=0 ; i--)
{
    numberVect[i] = R%2;
    R/=2;
}

// Display
cout<<numberVect[0]<<","<<numberVect[1]<<","<<numberVect[2]<<","<<numberVect[3]<<endl;

注意:如果您不知道,static_cast<int> (x)是执行(int)x的C ++方式。

答案 1 :(得分:2)

您应该在程序启动时使用当前时间为随机生成器播种,以避免此行为。

答案 2 :(得分:1)

您需要为随机数播种。使用时间是常见的做法。

答案 3 :(得分:1)

在使用之前,您需要为随机生成器播种。为此,您需要srand()

我通常将当前时间传递给srand()作为:

#include <time.h>

srand(time(NULL)); //seeding!

//now use
int whatever = rand();

现在,每次运行此代码时,即使两次连续运行之间存在一秒差异,也会得到不同的随机序列。

答案 4 :(得分:0)

在生成任何随机数之前,请在程序中执行此操作:

  srand(time(NULL));

随机数生成器不是“真正随机”,它需要从某个地方开始,通常人们会将当前系统时间用作一个好的“有点随机”起点,保证程序的每次运行都不同

您的第二个问题:您是否可以确保至少有一个值是“1”而仍然是随机的?好吧,不,当然不是,那么它不会是随机的。 :)你可以进行后期处理,如果你愿意放弃一些“随机性” - 生成向量后,检查是否至少有一个“1”值。如果不是,请将其中一个设置为“1”。 :)

答案 5 :(得分:0)

您必须初始化随机种子。包括stdlib.h和time.h,然后在第一次调用rand()之前调用它:

srand(time(NULL));

此代码使用当前系统时间(以秒为单位)初始化随机种子,因此您总是会得到不同的结果(除非您在一秒钟内启动程序两次。)

答案 6 :(得分:0)

每次运行程序时都会得到相同的结果,因为你没有播种rand。通常建议根据时间播种:

srand(time(NULL));

要确保至少1个数字为1,您可以使用bool来指示您是否已获得1。如果在数组的末尾,你没有1,最后调用rand并使用矢量大小的mod,并将该值设置为1.