【问题标题】:Random string generator in c++ returns the same value in loopsc++中的随机字符串生成器在循环中返回相同的值
【发布时间】:2021-03-13 06:32:40
【问题描述】:

我有一个函数可以在我的程序中生成 随机字符串,它可以按我的意愿工作,但仅与 循环 分开。 当我在 main() 的循环中使用它时,它每次都返回相同的字符串(例如 20)。 这是那个函数:

string randomString()
{
string c;
int r = NULL;
int num = 7;
srand(time(NULL));
for (int i = 0; i < num; i++)
{
    r = rand() % 26;
    c += 'a' + r;   
}
cout << "Random string: " << c << " \n";
return c;
}

我应该怎么做才能让它在每个循环中返回不同的字符串? 感谢您的帮助。

【问题讨论】:

  • 只在程序开始时调用srand一次
  • 解释。 srand 每次调用它时都会重置随机数生成器。这就是为什么你每次都会得到相同的“随机”字符串。即使您将时间传递给 srand,但如果自上次调用 srand 后经过的时间不够,您将获得相同的随机数。
  • 谢谢,这正是我要找的
  • 一般建议:阅读您正在使用的东西的文档。 srands 唯一的目的是产生你刚刚看到的效果。这次你得到的随机数不是随机的,下一次可能是别的东西......

标签: c++ string random


【解决方案1】:

正如评论者指出的那样,srand() 设置随机数生成器,并播种它的初始值。因此,对于rand() 的任何使用,每个程序只能使用一次

在这种情况下,对srand() 的调用应该从randomString() 中取出,并放在第一次调用rand() 之前的某个位置,可能在main() 中。

【讨论】:

    【解决方案2】:

    由于这个问题被标记为C++,我建议使用std::uniform_int_distribution。与mersenne_twister_engine 一起,它应该会生成质量更好的伪随机数。您可以在链接末尾看到如何使用它的示例。

    【讨论】:

    • 这并不能回答问题中出现问题的原因。如果出现与问题中相同的错误,std::uniform_int_distributionmersenne_twister_engine 实际上也可能出现此问题。
    • 使用质量更好的 prng 也会犯同样的错误。
    • 同意,将更新我的答案以反映这一点。
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多