C ++随机数生成器明显故障:我不走运吗?

时间:2017-09-14 00:08:36

标签: c++ string c++11 random

我想尝试使用C ++随机数生成器,但似乎无法获得非常令人满意的结果。例如,这里是尝试创建随机字符串的尝试。

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

std::string f(unsigned int n){
    std::uniform_int_distribution<int> dis025(0, 25);
    std::mt19937 gen_mt(n);
    std::string str(5, '\0');
    for(int i = 0; i<5; i++)
        str[i] = (char)('a' + dis025(gen_mt));
    return str;
}
int g(unsigned int n, int m){
    std::uniform_int_distribution<int> dis(0, m);
    std::mt19937 gen_mt(n);
    return dis(gen_mt);
}
int main() {
    std::string s = f(g(106175305, 40000000)) + " " + f(g(53718209, 40000000));
    std::cout << "Random string: " << s << std::endl;
}

Link to Coliru

(我不得不使用f(g())伎俩,以便停止侮辱侮辱。)
这很烦人,我怀疑这是理想的行为。但不知何故,我无法阻止它,它再次发生,再次......

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

std::string fx(unsigned int n, int m){
    std::uniform_int_distribution<int> dis(0, m);
    std::mt19937 gen_mt(n);
    std::string str(6, '\0');
    for(int i = 0; i<6; i++)
        str[i] = (char)('.' + dis(gen_mt));
    return str;
}
int g(unsigned int n, int m){
    std::uniform_int_distribution<int> dis(0, m);
    std::mt19937 gen_mt(n);
    return dis(gen_mt);
}
int main() {
    std::string s1 = fx(g(66730461, 90000000) + 400000000, 33) + "/" + fx(g(28989020, 90000000) * 10, 43);
    std::cout << s1 << std::endl;
}

Coliru
......再一次。

int main() {
    std::string s2 = fx(g(66730461, 90000000) + 400000000, 33) + "/" + fx(g(81141643, 90000000) + 100000000, 43);
    std::cout << s2 << std::endl;
}

你经常遇到那种问题吗?或者我特别不走运?

1 个答案:

答案 0 :(得分:3)

我的伤心的朋友,我必须告诉你,我一生都没有遇到过运气不好的程序员。随机字符串生成器创建人类可读输出的可能性是百万分之一,但你设法连续三次(一万亿分之一?)

老实说,诀窍很聪明。愿你未来的努力更加可预测:)

(未来读者:结果是使用手工挑选的伪随机种子值生成的,这些值恰好输出特定的字符串,如“hello world”等...查看问题的评论以获取更多信息)