2012-04-12 13 views
1

-1から6の範囲で乱数を生成しようとしていますが、乱数を生成するたびに範囲内の数値を取得する割合はパーセントで指定します。たとえば、パーセンテージのリストでは、最初のパーセンテージは6を生成する確率を持ち、2番目のパーセンテージは5を生成する確率を持ちます。数字はランダムに生成する必要があります。私はこれをCでコード化しようとしています。あなたのアイデアをありがとう。数値の確率を与えられた範囲内で乱数を生成する方法

+0

VTC-ersに。これは実際には非常に一般的なことです(ローカライズされたものとは反対ですが)。ちょっと複雑な形で記述されていますが、 – bitmask

答えて

4

0から100までの乱数を取得して、それに該当するパーセンテージ範囲を確認し、それに対応する値を割り当てることができます。例えば

0 - 5 : -1 
    5 - 25 : 0 
    25 - 31: 1 
    31 - 48: 2 
    48 - 50: 3 
    50 - 75: 4 
    75 - 87: 5 
    87 - 100: 6 

EDIT:

使用すると、1つのまたは2つの配列の割合の境界を保存する1(5、25、31、48を意味し、50が必要になり、これを実装するには、75,87)と出力値を格納する別の配列(出力が完全にランダムであれば、ここでは順番に2番目の配列は必要ありません)。
そして、あなたは、これがOでに対応して何パーセントの範囲を見つけるためにバイナリ検索方法を使用することができます。これにより、0から100

間のランダムなint型の場合は0と100またはrand() % 100 + 1の間のランダムな浮動小数点数を取得するためにrand() * 100.0/RAND_MAXを呼び出して取得します(log n)時間である。インデックスを使用すると、対応する出力を見つけることができます(配列または関数を介して)

+0

私は実際にこのようなことをしましたが、私はそれが間違っていると教えました。しかし、私のためにそれを明確にすることに感謝 – user1319817

0

これを実行する方法はほかにもありますが、おそらくこれが良いでしょう。あなたのパーセンテージに応じて各番号のコピー(-1〜6)。次に、配列内の要素をランダムに選択します。

+0

これは、パーセンテージが0.5%のようなパーセンテージの場合、これは動作しません – SirGuy

1

これは宿題ですか?私は人間性を信じるためにそうではないと思います)

つまり、すべてのパーセンテージが100になるはずです。 0から100までの数字を生成し、どの括弧に当てはまるかを調べることができます。

あなたのパーセンテージは、[10,20,35,15,10,10]

である場合、すなわち次に第1ブラケットはとても10の下に生成された任意の数が6

x < 10 --> 6 
10 <= x < (10+20) --> 5 
(10+20) <= x < (10+20+35) --> 4 
(10+20+35) <= x < (10+20+35+15) --> 3 
をyeilds "< 10" であります

などです。たとえば、11.9のような精度のパーセンテージを満たすために、1から100の間のランダムな浮動小数点数を生成したいとします。

+0

ない家庭仕事私は単純なテキストベースのゲームを作ろうとしていました。入力をありがとう:) – user1319817

0

私はそれを行うための最も簡単な方法は、以下の類推を考慮することであると思う:

あなたはラインを持っている場合は、[0,1]、あなたは1から4までの数を生成する分割と等価であると考えることができますS_1 = [0,1/4]、S_2 = [1/4,2/4]、S_3 = [2/4,3/4]、S_4 = [3/4,1]である。そうすると、[0,1]から数値を生成するとき、それがセグメントS_iに該当する場合、生成された数はiになります。

各数値に異なる確率を割り当てる場合は、p_iとして、p_iに従って異なるサイズのセグメントを分割するだけです。

たとえば、p_1 = 0.1の場合2、p_2 = 0.4の場合2、p_3 = 0.2の場合3、p_4 = 0の場合4。3の場合、S_1 = [0、p_1]、S_2 = [p_1、p_1 + p_2]、S_3 = [p_1 + p_2、p_1 + p_2 + p_3]、S_4 = [p_1 + p_2 + p_3、p_1 + p_2 + p_3 + p_4]

次に、[0,1]に一様乱数を生成し、それがS_iに含まれるかどうかをテストします。

+0

あなたは良い点があります。これは私のソリューションに非常によく似ていますが、比率が正しい限り、範囲は実際にはあなたが使用したいと思うあらゆる範囲で可能です。パーセンテージと乱数ジェネレータがすでにその範囲にある場合、0〜1の範囲を設定するといいです。 – mltsy

1

100個の要素を持つように配列を作成し、-1から6までの数字で入力します。たとえば、15%のヒットを得るために-1が必要な場合は、15個の要素に-1を入力します。 は1から100までの乱数を生成し、単純に配列を検索すると、実際の結果に重み付けされます。

+0

は、テキストベースのゲームを行っているので、0.5%の – SirGuy

+0

のように小数点以下のパーセントでは機能しません。そうでない限り、整数パーセンテージで十分です。これはまた、高周波使用のために良好な性能を与えるはずである。 – pizza

+0

合意しました、私はあなたの方法が無効であるということを意味しなかった、ちょうど警告 – SirGuy

関連する問題