C ++随机名生成器提供重复字符串

时间:2018-03-17 01:43:06

标签: c++ random

我将一个旨在构建随机名称的小程序拼凑在一起。它没有完成,但如果我尝试重新运行程序,它目前正在重复相同的名称。程序基于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

这不是巧合吗?

非常感谢任何帮助,如果有任何文档可以解释这一点,或者有人知道原因请告诉我,谢谢。

3 个答案:

答案 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));