我有一个简单的整数向量,只有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
答案 0 :(得分:6)
您需要使用srand为随机数生成器播种。
生成的伪随机数序列取决于种子值(因此可以用相同的种子值重现)。我使用当前时间作为种子值:
srand(time(NULL));
只有16种可能的序列供您选择(4位)。
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
在这些中,您想要随机选择至少1
高位的一个。因此,您只需要随机选择1到15之间的数字,然后将其转换为二进制数!
有两种方法可以做到这一点:
int R = rand() % 15 + 1;
float r = static_cast<float>(rand())/RAND_MAX;
int R = static_cast<int>( ceil(1 + (15-1)*r) );
获得R
,convert 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.