我有一个简单的整数向量,只有4个值.我想循环遍历向量,为每个值分配0或1.我希望它随机到每次都不同的程度.
我认为以下就足够了:
for (int i = 0; i < (int)numberVect.size(); i++)
{
numberVect[i] = rand() % 2;
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现每次关闭并重新打开程序时,都会分配完全相同的值.
所以第一次通过它将是1,0,0,0,然后如果我再次运行循环而不关闭程序它将是0,1,0,1.这看起来很完美.
但是,关闭程序并重新启动后,我会发现第一个序列将再次为1,0,0,0,第二个序列将再次为0,1,0,1.
另外,我有关于这个问题的第二个问题:
你能建议一种方法来确保向量中的至少一个值是1吗?同时仍然允许随机生成无缝地工作?
非常感谢,我希望你们可以提供帮助:D
您需要使用srand为随机数生成器播种.
产生的伪随机数序列取决于种子值(因此可以用相同的种子值再现).我使用当前时间作为种子值:
srand(time(NULL));
Run Code Online (Sandbox Code Playgroud)
只有16种可能的序列供您选择(4位).
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Run Code Online (Sandbox Code Playgroud)
其中,您要随机选择至少1高位的一个.因此,您只需要随机选择1到15之间的数字,然后将其转换为二进制!
有两种方法可以做到这一点:
int R = rand() % 15 + 1;
Run Code Online (Sandbox Code Playgroud)
float r = static_cast<float>(rand())/RAND_MAX;
int R = static_cast<int>( ceil(1 + (15-1)*r) );
Run Code Online (Sandbox Code Playgroud)
完成后R,将其转换为二进制.这是一个方法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;
Run Code Online (Sandbox Code Playgroud)
static_cast<int>(x)(int)x