我将一个旨在构建随机名称的小程序拼凑在一起。它没有完成,但如果我尝试重新运行程序,它目前正在重复相同的名称。程序基于Ubuntu Linux构建,运行emacs文本编辑器的C ++。
下面是完整的代码,我仍然是C ++的新手,但以前没有遇到过这个问题。
#include <iostream>
#include <vector>
#include <iomanip>
#include <stdlib.h>
using namespace std;
string randomName(int length) {
char consonents[] = {'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z'};
char vowels[] = {'a','e','i','o','u','y'};
string name = "";
int random = rand() % 2;
int count = 0;
for(int i = 0; i < length; i++) {
if(random < 2 && count < 2) {
name = name + consonents[rand() % 19];
count++;
}
else {
name = name + vowels[rand() % 5];
count = 0;
}
random = rand() % 2;
}
return name;
}
int main() {
cout << "Enter a name length: " << endl;
int length;
cin >> length;
cout << randomName(length) << endl;
return 0;
}
我已经阅读了rand()的可预测性,在其他类似的问题中,他们提到rand()经常重复值。当然,这不可能是程序运行的每一次都可以吗?
在示例中: 如果我运行名称长度为5的程序,我可能会得到类似:tfuvi
如果我再次运行程序,名称长度为2,我将得到:tf
如果我第三次运行程序,名称长度为4,我将得到:tfuv
这不是巧合吗?
非常感谢任何帮助,如果有任何文档可以解释这一点,或者有人知道原因请告诉我,谢谢。
答案 0 :(得分:2)
如果未提供种子值,
rand()
函数将自动播种,值为1.
这意味着每次运行程序时,总会得到相同的伪随机序列。因此,请使用srand(time(NULL))
或以其他方式为您的随机数生成器播种:Recommended way to initialize srand?
答案 1 :(得分:0)
在致电rand()
之前设置种子:
srand(time(NULL));
然后你可以拨打rand() % n
还要确保包含ctime for time();
答案 2 :(得分:0)
你必须初始化随机种子,在你的程序中使用 rand()函数之前调用它
srand (time(NULL));