1

私はこれに対する答えを探していましたが、私が見つけたすべての議論は、私が理解できない言語であるか、各要素が独自の重みを持つコレクションを持つことに依存しています.

基本的に、0 と 10 の間の乱数を取得したいだけです。これは、5 が 0 と 10 よりも頻繁に発生するため、「中間加重」です。基本的に、任意の数値を与えることができるアルゴリズムを見つけようとしています。私が定義した最小値と最大値の間の「重み付けされた数値」と、生成されたすべての数値が適切に重み付けされます。「これについては考えたくありません。ただ座って他の人がこれを行うのを待ちます」のように聞こえるかもしれませんが、私はこれについて1時間ほど考え、検索しており、本当に迷っています. :|

最後に、(拡張メソッドを介して)呼び出すことができるようにしたい

random.NextWeighted(MIN, MAX, WEIGHT);
4

2 に答える 2

4

逆正規分布法を利用できます。

  1. 乱数をスケーリングして、0と1の間の2倍になるようにします。

  2. それをInverseNormalDistributionに渡します。

  3. 重みに基づいて戻り値をスケーリングします。(たとえば、100を超える重量で割ります。)

  4. [(MIN + MAX)/ 2] + [(ScaledValue)X(MAX-MIN)]を計算します

  5. それがMIN未満の場合は、MINを返します。MAXを超える場合は、MAXを返します。それ以外の場合は、この値を返します。

于 2011-10-03T21:42:10.180 に答える
3

0 から 10 の間の他の数字よりも 5 をどのくらい頻繁に表示したいかはわかりませんが、必要な分布で配列を作成できます。

何かのようなもの

var dist = new []{0,1,2,3,4,5,6,7,8,9,10,5,5,5};

次に、0 と 13 のランダムな位置を取得します。0 から 10 の間の数字を取得しますが、5 は他の値よりも 4 倍多くなります。かなり高速ですが、0 から 10 億の間の数値が必要な場合はあまり実用的ではありません。

于 2011-10-03T21:52:44.387 に答える