我想用fortran90/95或Python在[2E16,5E20]之间生成一些统一的随机数。我知道如果“R”是一个介于0和1之间的随机数(0<;R<;1),我们可以将R转换为[a,B],如下所示:
R=(b-a)*R+a
但是当我使用这个算法在[2E16,5E20]之间生成一些随机数时,大多数生成的随机数都非常接近5E20。我知道为什么会发生这种情况,正因为如此,术语B-A大约等于B(因为B比A大),并且大多数生成的随机数都在B或B/10的范围内(我的意思是它非常接近B)
我怎样才能解决这个问题
我尝试应用的一个解决方案是,我将[2E16,5E20]间隔拆分为更小的间隔,例如:
[2e16,2e17],[2e17,2e18],[2e18,2e19],[2e19,2e20],[2e20,5e20]
我在上面的每一个间隔之间生成了一些随机数
还有其他解决办法吗?我的解决方案正确吗
这不是一个编程问题,而是一个数学问题
您需要考虑从哪个分布中提取随机数。任何跨越几个数量级的uniform distribution总是会产生更多指数较大的数,而不是指数较小的数
如果你想用每个指数产生一个相同数量的分布,你应该考虑log uniform distribution,它可以用scipy.stats.loguniform来采样。
相关问题 更多 >
编程相关推荐