【发布时间】:2019-04-25 13:49:17
【问题描述】:
libsodium 库有一个函数
uint32_t randombytes_uniform(const uint32_t upper_bound);
但显然这会返回一个无符号整数。我可以以某种方式使用它在[-a,a] 范围内生成均匀分布的随机double,其中a 也是用户给出的双精度数?我特别关注均匀分布/无偏见的结果,这就是我想使用libsodium 库的原因。
【问题讨论】:
-
rand() 有什么问题?
-
我担心它的均匀分布的保证,重要的是生成的结果尽可能不带偏见。
-
如果你搜索“random double”,你会发现很多关于这个的其他问题。但是你的问题定义不明确。浮点格式在零附近比远离零更好。如果您从一个区间内的均匀分布中选择一个实数,并将其四舍五入为可在
double中表示的最接近的值,则某些值会比其他值更频繁地出现,因为它们离邻居更远,而实数的跨度对它们的舍入比double接近零的值要长。 -
此外,端点在区间内的频率将是其邻居频率的一半。有时在选择“随机”浮点值时,人们希望使用均匀间隔的值群,忽略更精细值。这取决于输入数字的目的。你用随机数做什么?
-
@EricPostpischil 我看不出一个数学上简单的任务,比如“选择一个范围内均匀分布的随机实数”是如何定义不明确的。我不精通数字精度和实数表示等主题,所以这项任务不可能吗?另外,我想如果这意味着我可以选择“粒度”并且结果将是
0.001的倍数,我们可以选择使用“均匀分布的值的群体,忽略更精细的值”均匀分布在 [-1.245, 3.523] 范围内?