【发布时间】: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;
}
(我不得不使用 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 看起来有人选择的随机种子会产生这些输出值,但仅限于特定的生成器实现。聪明,但不便携。
-
我投票决定将此问题作为离题结束,因为它根本不是一个问题。