我想在(0,2)
之间生成随机数。我使用以下代码:
double fRand(double fMin, double fMax)
{
double f = (double)rand() / RAND_MAX;
return fMin + f * (fMax - fMin);
}
并设置:
fMin = 0; fMax = 2;
但我没有得到统一分布的数字。我把这个函数称为循环。
它生成随机数,但几乎所有数字都只落在两个区域,而不是均匀分布。
如何确保数字均匀分布?
答案 0 :(得分:3)
有两种方法可以做到这一点。
你可以使用rand,但你的结果会略有偏差。
rand()
做了什么:
Returns a pseudo-random integral number in the range between 0 and RAND_MAX.
示例:
RandomFunction = rand() % 100; // declares a random number between 0-99
RandomFunction2 = rand() % 100 + 1; // declares a random number between 1-100
This is in the library #include <cstdlib>
您还可以使用
设置种子srand()
这样做是设置随机数的值,如果用srand()
的相同值重复该函数,则该值将相同。这在调试中有时是首选,因为它可以使结果清晰。
此处还有寻找无偏值的功能,
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 10);
//This function creates a random number between 1-10 and is stored in dis(gen).
// You can change the name of dis if you like.
示例:
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 6);
for (int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
}
这会在10
之间生成1-6
个随机数。示例参考:cppreference