产生随机字母

时间:2018-12-27 11:22:05

标签: c++ random

string bolsa_letras::letters_generator(int quantity){
    int already_generated = 0;
    map<char, int> aux = values;
    string out;
    while(already_generated != quantity){
        char generated_char = 'A' + rand()%26;
        if(aux[generated_char] > 0){
            out.push_back(generated_char);
            aux[generated_char]--;
            already_generated++;
        }
    }

    return out;
}

上面是给定数字生成随机字母的代码。

地图会保存字母和出现字母的时间。问题是,每次我运行代码时,它都会打印出相同的内容:NLRBBMQH。为什么会这样?

我为rand函数添加了cstdlib。

1 个答案:

答案 0 :(得分:6)

确定性程序不能自然地产生随机性。我们需要从其他地方获得这种随机性。在rand()的过去,通常seed RNGstd::time(NULL)的结果在每次运行时都会产生不同的状态。

如今,我们使用<random>提供的“更随机”的工具。

cppreference.com's documentation on std::uniform_int_distribution中,您可以找到类型为int的整数的示例。现在,char也是整数类型。让我们稍微调整一下他们的示例:

#include <random>
#include <iostream>

int main()
{
    std::random_device rd;  // Will be used to obtain a seed for the random number engine
    std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
    std::uniform_int_distribution<char> dis('A', 'Z');

    for (int n=0; n<10; ++n) {
        std::cout << dis(gen) << ' ';
    }
    std::cout << '\n';
}

还有tadaaaa!一个随机字母生成器:)

Live demo