我需要在指定的时间间隔内生成随机数,[max; min].
此外,随机数应该在区间上均匀分布,而不是位于特定点.
Currenly我正在生成:
for(int i=0; i<6; i++)
{
DWORD random = rand()%(max-min+1) + min;
}
Run Code Online (Sandbox Code Playgroud)
从我的测试中,只有一点产生随机数.
Example
min = 3604607;
max = 7654607;
Run Code Online (Sandbox Code Playgroud)
随机数生成:
3631594
3609293
3630000
3628441
3636376
3621404
Run Code Online (Sandbox Code Playgroud)
从下面的答案:好的,RAND_MAX是32767.我在C++ Windows平台上.有没有其他方法来生成具有均匀分布的随机数?
我使用以下代码来测试c++ <random>库.
为什么每次运行已编译的可执行文件时都会得到完全相同的序列?rd()编译是确定性的吗?如何为每次运行获得不同的输出?
Windows 7 64位上的GCC 4.8.1.使用http://nuwen.net/mingw.html上的 MinGW发行版
编辑:我用Visual Studio测试了相同的代码.没有问题.输出是不确定的.这可能是我使用的mingw gcc 4.8.1中的一个错误.
#include <iostream>
#include <random>
using namespace std;
int main(){
random_device rd;
mt19937 mt(rd());
uniform_int_distribution<int> dist(0,99);
for (int i = 0; i< 16; ++i){
cout<<dist(mt)<<" ";
}
cout <<endl;
}
Run Code Online (Sandbox Code Playgroud) 我需要在最大值内生成随机整数.由于性能至关重要,我决定使用XORShift生成器而不是Java的Random类.
long seed = System.nanoTime();
seed ^= (seed << 21);
seed ^= (seed >>> 35);
seed ^= (seed << 4);
Run Code Online (Sandbox Code Playgroud)
这个实现(源代码)给了我一个长整数,但我真正想要的是一个介于0和最大值之间的整数.
public int random(int max){ /*...*/}
Run Code Online (Sandbox Code Playgroud)
实现此方法的最有效方法是什么?
我将如何快速和安全*确定范围内的随机数0(含)至r(独家)?
换句话说,拒绝采样的优化版本:
u32 myrand(u32 x)
{
u32 ret = rand();
while(ret >= x)
ret = rand();
return(ret);
}
Run Code Online (Sandbox Code Playgroud)
*安全地,我的意思是统一分布.
我需要实现一个好的RNG,我猜Mersenne Twister可能对我有好处.我没有找到任何可行的C++实现,我是一个糟糕的谷歌搜索者还是真的不容易找到?!我以前尝试过rand():
srand((unsigned)time(0));
for (int i = 0; i < 9; i++) {
random = rand();
cout<<random;
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,但随机变量总是相同的数字.....但是如果我添加一个Sleep(1000),它的工作原理!像这样:
srand((unsigned)time(0));
for (int i = 0; i < 9; i++) {
random = rand();
cout<<random;
Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)
所以我决定尝试Mersenne Twister ......有人能找到一个解决方案(因为我需要找到非常大量的随机数,所以我不能使用Sleep(1000),这需要时代!)或者帮助我实现Mersenne Twister或者也许是另一个好的RNG.谢谢,抱歉我的英语不好......