【问题标题】:C++ Random number generator apparent malfunction: am I unlucky?C++ 随机数生成器明显故障:我不走运吗?
【发布时间】:2017-09-14 00:08:36
【问题描述】:

我想尝试 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;
}

你经常遇到这样的问题吗?还是我特别倒霉?

【问题讨论】:

  • 这里的目标是什么?特定范围内不可预测的随机字符,还是基于种子的可重复随机字符串?
  • 除非我遗漏了什么,否则这个问题似乎是个笑话:@Georg:我恐怕要说,你非常不幸,因为当我使用除你之外的任何种子值时,我会随机字符串(如"yrsfs vkmhd")而不是hello world :)
  • @tadman 我做种子gen_mt。不过,尽量不要给它太简单的种子,所以我也在那里使用了一些(伪)随机数。
  • @ContinuousLoad 看起来有人选择的随机种子会产生这些输出值,但仅限于特定的生成器实现。聪明,但不便携。
  • 我投票决定将此问题作为离题结束,因为它根本不是一个问题。

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


【解决方案1】:

我伤心的朋友,我必须告诉你,我这辈子从来没有遇到过像你这样倒霉的程序员。随机字符串生成器创建人类可读输出的机会是百万分之一,但您设法连续完成 3 次(万亿分之一?)

老实说,这个把戏很聪明。愿你未来的努力更加可预测:)

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 2020-07-25
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多