2

1 から 10 までの値の範囲があるとします。ある種のガウス確率に基づいて、この範囲から数値をランダムに選択したいと考えています。したがって、約 4、5、6 の値を取得する可能性が高くなります。1 と 10 が出る可能性はまだありますが、可能性は低くなります。ガウス分布に従う必要はありません。1 と 10 の値を取得するのはほとんど不可能だからです。私が望むのは、他の値も取得する可能性を広げながら、極端な値を取得する可能性を少なくとも変更して歪めることです。ゆがめることで、10 を取得するチャンスを 1 より大きくしたい場合があることを意味します。そのため、分布は必ずしも対称的であるとは限りません。

Random クラスを使用してランダムな float 値をシードし、その値に 10 を掛けてみましたが、おそらくまだ線形です。どうすればそれができるのか考えられません。これを達成する簡単な方法はありますか?

4

2 に答える 2

2

C# では、からの値Randomは一様に分布しているため、それらに定数を掛けると、単に値の範囲がシフトします。

ただし、Box-Muller 変換を使用すると、2 つの一様確率変数を使用してガウス分布を作成できます。

実装については、この質問への回答を確認してください。

于 2013-04-01T18:25:16.330 に答える
1

これはあなたを助けるかもしれません:

確率関数を値 1 から 10 に適用します。次に、それらの頻度を取得します。ここで、1 から 10 までの値をそれぞれの頻度に基づいて繰り返す配列を作成します。例えば:

int[] values = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 10 };

変数を使用して、Random0 から までの数値 (インデックス) を取得できるようになりましたvalues.Length。最後に値 [index] を返します。

于 2013-04-01T18:25:04.727 に答える