从 D 中所有可能的浮点数中抽样
Sampling from all possible floats in D
在 D 编程语言中,标准随机 (std.random) 模块提供了一种简单的机制来生成某个指定范围内的随机数。
auto a = uniform(0, 1024, gen);
D 中从所有可能的 浮点值中采样的最佳方法是什么?
为澄清起见,可以按如下方式对所有可能的 32 位整数进行采样:
auto l = uniform!int(); // randomly selected int from all possible integers
取决于您想要的分发类型。
可以通过生成随机 ulong 然后将位转换为浮点数来实现对所有可能值的均匀分布。对于 T
为 float 或 double:
union both { ulong input; T output; }
both val;
val.input = uniform!"[]"(ulong.min, ulong.max);
return val.output;
由于大约一半的正浮点数介于 0 和 1 之间,因此此方法通常会为您提供接近零的数字。它还会为您提供无穷大和 NaN 值。
旁白:此代码在 D 中应该没问题,但在 C/C++ 中将是未定义的行为。在那里使用 memcpy
。
如果您更喜欢浮点数中所有可能的 数字 的均匀分布(0..1 和 1..2 等的概率相等),您需要像 normal 这样的东西uniform!double
,不幸的是,这对大数字来说效果不佳。它也不会生成无穷大或 NaN。您可以生成 double
数字并将它们转换为 float
,但我没有生成随机大 double
数字的答案。
在 D 编程语言中,标准随机 (std.random) 模块提供了一种简单的机制来生成某个指定范围内的随机数。
auto a = uniform(0, 1024, gen);
D 中从所有可能的 浮点值中采样的最佳方法是什么?
为澄清起见,可以按如下方式对所有可能的 32 位整数进行采样:
auto l = uniform!int(); // randomly selected int from all possible integers
取决于您想要的分发类型。
可以通过生成随机 ulong 然后将位转换为浮点数来实现对所有可能值的均匀分布。对于 T
为 float 或 double:
union both { ulong input; T output; }
both val;
val.input = uniform!"[]"(ulong.min, ulong.max);
return val.output;
由于大约一半的正浮点数介于 0 和 1 之间,因此此方法通常会为您提供接近零的数字。它还会为您提供无穷大和 NaN 值。
旁白:此代码在 D 中应该没问题,但在 C/C++ 中将是未定义的行为。在那里使用 memcpy
。
如果您更喜欢浮点数中所有可能的 数字 的均匀分布(0..1 和 1..2 等的概率相等),您需要像 normal 这样的东西uniform!double
,不幸的是,这对大数字来说效果不佳。它也不会生成无穷大或 NaN。您可以生成 double
数字并将它们转换为 float
,但我没有生成随机大 double
数字的答案。