double値「vals」の配列があります。この配列にランダムにインデックスを付けて値を取得する必要があります。GenRandomNumber()は0から1までの数値を返しますが、0または1は返しません。Convert.ToInt32を使用して基本的にすべてを小数点以下の桁数の左側に配置していますが、これを行うより効率的な方法が必要ですか?
これが私のコードです:
public double GetRandomVal()
{
int z = Convert.ToInt32(GenRandomNumber() * (vals.Length));
return vals[z];
}
ありがとう
アップデート
返信してくれたすべての人に感謝しますが、メソッドrand.NextDouble()を持つ提供されたMersenneTwister乱数実装を使用するように制約されています
アップデート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の配列を提供する許容可能な乱数を事前入力できますか?
FYI valsは、正規分布曲線を分割する長さ1048576の二重配列です。私は基本的にこのメカニズムを使用して、正規分布の数値をできるだけ速く作成しています。モンテカルロシミュレーションでは、毎日数十億の正規分布の乱数を使用するため、少しでも役立ちます。