我有一个 double 值数组“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 之间的随机数,然后使用它随机索引到数组中。 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 的 double 组,用于划分正态分布曲线。我基本上是在使用这种机制尽可能快地创建正态分布的数字,蒙特卡洛模拟每天使用数十亿个正态分布的随机数,所以一点点帮助。
最佳答案
尝试使用随机整数:
Random random = new Random();
int randomNumber = random.Next(0, vals.Length);
return vals[randomNumber];
关于c#随机索引到数组的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1154879/