如何为同一变量生成不同的随机数

时间:2019-02-05 13:21:43

标签: c++

我想使用while循环为变量生成一个随机数,以拼出一个乱码。我的问题是我的代码生成的数字是随机的,但重复该数字而不是使用新数字。

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    string wordList[5] = {"cool", "friend", "helpful", "amazing", 
"person"};
    srand(time(0));
    int rWord = rand() % 5 + 1;
    string randWord = wordList[rWord];
    int runs = 0;
    int wordLen = randWord.length();
    while(runs != wordLen){
        int ranLN = rand() % wordLen;
        char randLetter = randWord[ranLN];
        cout << randLetter;
        runs++;
}

return 0;
}

我希望我的结果是一个完全混乱的单词,但我反而收到了重复的字母。例如,我把“朋友”一词加为“ eennn”。

2 个答案:

答案 0 :(得分:2)

如注释中所建议,rWord的当前范围是1,2,3,4,5,必须固定为0,1,2,3,4。 因此,在以下答案中,我从其初始化方程式中删除了+1。 另外,ranLN可以重复,因此您可以重复输入字母。

然后,一种可能的方法是递归改组randWord的所有字符,并在while循环完成后输出它们,如下所示。 以here为例显示了相同的算法:

DEMO

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <utility>

int main()
{
    std::string wordList[5] = {"cool", "friend", "helpful", "amazing", "person"};

    srand(time(0));

    std::size_t rWord = rand() % 5;
    std::string randWord = wordList[rWord];

    std::size_t runs = 0;
    std::size_t wordLen = randWord.length();

    while(runs != wordLen)
    {
        std::swap(randWord[runs], randWord[rand() % wordLen]);        
        ++runs;
    }

    std::cout << randWord << std::endl;

    return 0;
}

顺便说一句,尽管rand()通常应该由更好的LCG来实现, 但是,例如(在我的本地)C ++标准草案n4687中指出的, rand()中使用的算法是完全由编译器实现定义的

  

29.6.9低质量随机数生成[c.math.rand]

int rand();
void srand(unsigned int seed);
     

... rand 的基础算法未指定。因此, rand 的使用仍然是不可移植的,其质量和性能不可预测且经常令人质疑。

幸运的是,在C ++ 11及更高版本中,我们可以使用<random>来生成保证的质量随机性。 因此,我建议您将它们与std::shuffle一起使用,如下所示。 如果您需要更高质量的随机性,可以使用std::mt19937代替std::minstd_rand

DEMO

#include <iostream>
#include <string>
#include <random>
#include <algorithm>

int main()
{
    std::string wordList[5] = {"cool", "friend", "helpful", "amazing", "person"};

    std::minstd_rand gen(std::random_device{}());

    std::uniform_int_distribution<std::size_t> dis(0, 4);
    std::size_t rWord = dis(gen);
    std::string randWord = wordList[rWord];

    std::shuffle(randWord.begin(), randWord.end(), gen);        
    std::cout << randWord << std::endl;

    return 0;
}

答案 1 :(得分:0)

以我的拙见,在生成所有随机词之后,使用设置数据结构会使随机词唯一。