我有一个双值数组“vals”,我需要随机索引到这个数组并获取一个值。GenRandomNumber() 返回一个介于 0 和 1 之间的数字,但从不返回 0 或 1。我使用 Convert.ToInt32 基本上将所有内容都放在小数点的左边,但必须有更有效的方法来做到这一点?
这是我的代码:
public double GetRandomVal()
{
int z = Convert.ToInt32(GenRandomNumber() * (vals.Length));
return vals[z];
}
谢谢
更新
感谢所有回复的人,但我只能使用提供的 MersenneTwister 随机数实现,该实现具有方法 rand.NextDouble()
更新 2
再想一想,我需要做的就是生成一个介于 0 和 array.length-1 之间的随机数,然后使用它随机索引到 array。vals 长度为 2^20 = 1048576,因此生成随机 int 就足够了。我注意到我的 MersenneTwister 有一个方法:
public int Next(int maxValue)
如果我把它称为vals[rand.Next(vals.length-1)]那应该做对吗?我还看到 MersenneTwister 有一个构造函数:
public MersenneTwister(int[] init)
不确定这是做什么用的,我可以使用它来预填充可接受的随机数,我为其提供一个 0 到 vals.length 的数组吗?
仅供参考 vals 是一个长度为 1048576 的双数组,用于划分正态分布曲线。我基本上是使用这种机制尽可能快地创建正态分布的数字,蒙特卡罗模拟每天使用数十亿个正态分布的随机数,所以每一点都有帮助。