uniform_int_distribution这里用错了? (我的结果似乎分布不均)
uniform_int_distribution used wrong here? (my results seem not equally distributed)
版本 3 将生成器移至 class。这次我的新随机数生成技术正确吗?
template<typename T = int>
class MyRandomGenerator
{
public:
MyRandomGenerator()
{
std::random_device rd;
gen = std::mt19937{rd()};
}
T getNumber(const T& From, const T& To)
{
std::uniform_int_distribution<T> dist(From, To);
return dist(gen);
}
private:
std::mt19937 gen;
};
这是我的新头寸计算器:
auto calculate_x_position = [&]() ->sf::Uint32 {return RandGen.getNumber(0, W - 1); };
auto calculate_y_position = [&]() ->sf::Uint32 {return RandGen.getNumber(0, H - 1); };
与之前相同 pattern/problem:
版本 2 每秒创建约 3 张地图,每张地图 10.000 颗星。结果还是一样。此外,更清楚的是地图顶部有一个枢轴。示例:
原题:
我开始尝试绘制一个简单的星图。为此,我首先计算星星的 x 和 y 位置。 X和Y在window.
的宽高范围内
这是我的随机数生成函数:
template<typename T>
T getRandomNumberBetween(const T& Min, const T& Max)
{
static std::random_device rd;
static std::uniform_int_distribution<T> dist{Min, Max};
return dist(rd);
}
我是这样使用的:
auto calculate_x_position = std::bind(inc::getRandomNumberBetween<sf::Uint32>, 0, Width-1);
auto calculate_y_position = std::bind(inc::getRandomNumberBetween<sf::Uint32>, 0, Height-1);
x = calculate_x_position(); //...
但是当我一遍又一遍地绘制我的地图时,在我看来,大多数星星往往存在的地方都有一个支点。例如。大多数星星都在我的 window.
的上半部分
示例:
我是不是用错了或有错误的期望?...因为here它说:
This distribution produces random integers in a range [a,b] where each
possible value has an equal likelihood of being produced.
亲切的问候
均匀分布并不具体意味着你会在屏幕的每个象限中获得相同的数量;这意味着每个点出现的机会均等。所以如果你做一个简单的 50:50 试验,并不意味着你会得到 50:50 个结果。
但是,如果您对 1,000,000 颗星星进行了测试,很可能它们几乎是均匀分布的。对我来说,这似乎是样本量的错误
您可以通过多种方式改进代码。一个引擎只能被创建一次,而不是每次你想要一个随机数。而且您通常不想使用 std::default_random_engine
,因为它可能默认为 std::rand
。更好的默认值是 std::mt19937
。我的示例来自 The bell has tolled for rand():
#include <random>
std::mt19937& prng_engine()
{
thread_local static std::random_device rd{};
thread_local static std::mt19937 engine{rd()};
// Or you can replace the two previous lines with:
//thread_local static std::mt19937
// prng{std::random_device{}()};
return engine;
}
template<typename T>
T getRandomNumberBetween(T Min, T Max)
{
thread_local static std::uniform_int_distribution<T> dist{Min, Max};
return dist(prng_engine());
}
版本 3 将生成器移至 class。这次我的新随机数生成技术正确吗?
template<typename T = int>
class MyRandomGenerator
{
public:
MyRandomGenerator()
{
std::random_device rd;
gen = std::mt19937{rd()};
}
T getNumber(const T& From, const T& To)
{
std::uniform_int_distribution<T> dist(From, To);
return dist(gen);
}
private:
std::mt19937 gen;
};
这是我的新头寸计算器:
auto calculate_x_position = [&]() ->sf::Uint32 {return RandGen.getNumber(0, W - 1); };
auto calculate_y_position = [&]() ->sf::Uint32 {return RandGen.getNumber(0, H - 1); };
与之前相同 pattern/problem:
版本 2 每秒创建约 3 张地图,每张地图 10.000 颗星。结果还是一样。此外,更清楚的是地图顶部有一个枢轴。示例:
原题: 我开始尝试绘制一个简单的星图。为此,我首先计算星星的 x 和 y 位置。 X和Y在window.
的宽高范围内这是我的随机数生成函数:
template<typename T>
T getRandomNumberBetween(const T& Min, const T& Max)
{
static std::random_device rd;
static std::uniform_int_distribution<T> dist{Min, Max};
return dist(rd);
}
我是这样使用的:
auto calculate_x_position = std::bind(inc::getRandomNumberBetween<sf::Uint32>, 0, Width-1);
auto calculate_y_position = std::bind(inc::getRandomNumberBetween<sf::Uint32>, 0, Height-1);
x = calculate_x_position(); //...
但是当我一遍又一遍地绘制我的地图时,在我看来,大多数星星往往存在的地方都有一个支点。例如。大多数星星都在我的 window.
的上半部分示例:
我是不是用错了或有错误的期望?...因为here它说:
This distribution produces random integers in a range [a,b] where each possible value has an equal likelihood of being produced.
亲切的问候
均匀分布并不具体意味着你会在屏幕的每个象限中获得相同的数量;这意味着每个点出现的机会均等。所以如果你做一个简单的 50:50 试验,并不意味着你会得到 50:50 个结果。
但是,如果您对 1,000,000 颗星星进行了测试,很可能它们几乎是均匀分布的。对我来说,这似乎是样本量的错误
您可以通过多种方式改进代码。一个引擎只能被创建一次,而不是每次你想要一个随机数。而且您通常不想使用 std::default_random_engine
,因为它可能默认为 std::rand
。更好的默认值是 std::mt19937
。我的示例来自 The bell has tolled for rand():
#include <random>
std::mt19937& prng_engine()
{
thread_local static std::random_device rd{};
thread_local static std::mt19937 engine{rd()};
// Or you can replace the two previous lines with:
//thread_local static std::mt19937
// prng{std::random_device{}()};
return engine;
}
template<typename T>
T getRandomNumberBetween(T Min, T Max)
{
thread_local static std::uniform_int_distribution<T> dist{Min, Max};
return dist(prng_engine());
}