- 论坛徽章:
- 0
|
本帖最后由 fallening_cu 于 2012-10-30 17:56 编辑
其实可以这样:- #include <cstdint>
- #include <cstddef>
- #include <vg.hpp>//在这里 https://github.com/fengwang/random_variate_generator
- int foo()
- {
- static vg::vg<double> gen(0.0, 1.0);
- if ( gen() > 0.4 ) return 1;
- return 0;
- }
- int gen_50_50()
- {
- std::uint64_t const a = 6364136223846793005ULL;
- std::uint64_t const b = 1442695040888963407ULL;
- std::uint64_t const mask = 256;
- std::uint64_t s = 1;
- for ( std::size_t i = 0; i != 64; ++i )
- {
- s <<= 1;
- s += foo();
- }
- static std::uint64_t ans = s;
- ans *= a;
- ans += b;
- return ans & mask ? 1 : 0;
- }
- //test
- int main()
- {
- const std::size_t n = 8888888;
- int acc = 0;
- for ( std::size_t i = 0; i != n; ++i )
- acc += gen_50_50();
- std::cout << "accumulation of " << n << " 0-1 random number is " << acc << "\n";
- return 0;
- }
复制代码 运行了3次,分别输出 4444442、4444443 和 4444445,应该可以接受作为一个 50-50 的随机数生成器 |
|