2010-12-12 5 views
9

擬似乱数(できればLuaで)を生成するにはどうしたらよいでしょうか。低い数値を与える確率が高い乱数発生器?

私の場合、低いスコアを得るのが一般的なゲームではランダムなスコアを与えたいが、高いスコアは得意ではない。 テーブルを使用する重み付き乱数ジェネレータを見たことがありますが、それは私の計画に合致しません。私はちょうど最小(0)最大(可変)を指定し、ほとんどの数値が低く保たれるようにしたい。

これは単純な数学的操作では可能だと思いますが、どれがどちらかを覚えていません。 math.randomの通常の出力をフィルタリングするのと同じように、本当にランダムなジェネレータは必要ありません。

答えて

2

これはスムーズに偏ったベルカーブではないので、2つのステップを作成しないでください。範囲の低いスコアを得る確率を定義し、それにマッチすれば範囲がより低い範囲になります。それ以外の場合、範囲は低範囲の上端から高範囲の終わりまでです。

通常の効果は、スコアが低くなることですが、スコアが高くなることがあります。私はそれがかなりよく見えるだろうと思って、非常に簡単です。

あなたはどう思いますか?

+0

ああ、実際にそれが動作することができ、どうもありがとうございました! – viktorry

4

私はちょうどこのように、標準のランダム関数の値を変換したい:

r1=math.random(0,255) 
r2=math.exp(math.random(0,255)) 

あなたのアカウントにあなたの境界を取る必要がありますが、あなたは低い値の多くの何かを持っているでしょう、それ以上のものはほとんどありません。

13

お試しmath.floor(minscore+(maxscore-minscore)*math.random()^2)希望の分布に合わせてパワーを調整します。

7

私はIhf's answerは非常に有用であることが判明、私はそれのためにC#メソッドを作成する:

private int GetRandomNumber(int max, int min, double probabilityPower = 2) 
    { 
     var randomizer = new Random(); 
     var randomDouble = randomizer.NextDouble(); 

     var result = Math.Floor(min + (max + 1 - min) * (Math.Pow(randomDouble, probabilityPower))); 
     return (int) result; 
    } 

probabilityPowerが1以上である場合、より低い値が高い値よりも一般的であろう。 0から1の間では、より高い値がより低い値よりも一般的になります。 1の場合、結果は一般的なランダムになります。

例(100万回の反復を持つすべて、分= 1、最大= 20):


probabilityPower = 1。5

1: 135534 (13.5534%) 
2: 76829 (7.6829%) 
3: 68999 (6.8999%) 
4: 60909 (6.0909%) 
5: 54595 (5.4595%) 
6: 53555 (5.3555%) 
7: 48529 (4.8529%) 
8: 44688 (4.4688%) 
9: 43969 (4.3969%) 
10: 44314 (4.4314%) 
11: 4(4.0123%) 
12: 39920 (3.992%) 
13: 40466 (4.0466%) 
14: 35821 (3.5821%) 
15: 37862 (3.7862%) 
16: 35222 (3.5222%) 
17: 35902 (3.5902%) 
18: 35202 (3.5202%) 
19: 33961 (3.3961%) 
20: 33600 (3.36%) 

probabilityPower = 4

1: 471570 (47.157%) 
2: 90114 (9.0114%) 
3: 60333 (6.0333%) 
4: 46574 (4.6574%) 
5: 38905 (3.8905%) 
6: 32379 (3.2379%) 
7: 28309 (2.8309%) 
8: 27906 (2.7906%) 
9: 22389 (2.2389%) 
10: 21524 (2.1524%) 
11: 19444 (1.9444%) 
12: 19688 (1.9688%) 
13: 18398 (1.8398%) 
14: 16870 (1.687%) 
15: 15517 (1.5517%) 
16: 15871 (1.5871%) 
17: 14550 (1.455%) 
18: 14635 (1.4635%) 
19: 13399 (1.3399%) 
20: 11625 (1.1625%) 

probabilityPower = 1

1: 51534 (5.1534%) 
2: 49239 (4.9239%) 
3: 50955 (5.0955%) 
4: 47992 (4.7992%) 
5: 48971 (4.8971%) 
6: 50456 (5.0456%) 
7: 49282 (4.9282%) 
8: 51344 (5.1344%) 
9: 50841 (5.0841%) 
10: 48548 (4.8548%) 
11: 49294 (4.9294%) 
12: 51795 (5.1795%) 
13: 50583 (5.0583%) 
14: 51020 (5.102%) 
15: 51060 (5.106%) 
16: 48632 (4.8632%) 
17: 48568 (4.8568%) 
18: 50039 (5.0039%) 
19: 49863 (4.9863%) 
20: 49984 (4.9984%) 

probabilityPower = 0.5

1: 3899 (0.3899%) 
2: 5818 (0.5818%) 
3: 12808 (1.2808%) 
4: 17880 (1.788%) 
5: 23109 (2.3109%) 
6: 26469 (2.6469%) 
7: 33435 (3.3435%) 
8: 35243 (3.5243%) 
9: 42276 (4.2276%) 
10: 47235 (4.7235%) 
11: 52907 (5.2907%) 
12: 58107 (5.8107%) 
13: 63719 (6.3719%) 
14: 66266 (6.6266%) 
15: 72708 (7.2708%) 
16: 79257 (7.9257%) 
17: 81830 (8.183%) 
18: 87243 (8.7243%) 
19: 90958 (9.0958%) 
20: 98833 (9.8833%) 

probabilityPower = 0.4

1: 917 (0.0917%) 
2: 3917 (0.3917%) 
3: 3726 (0.3726%) 
4: 10679 (1.0679%) 
5: 13092 (1.3092%) 
6: 17306 (1.7306%) 
7: 22838 (2.2838%) 
8: 29221 (2.9221%) 
9: 35832 (3.5832%) 
10: 38422 (3.8422%) 
11: 47800 (4.78%) 
12: 53431 (5.3431%) 
13: 63791 (6.3791%) 
14: 69460 (6.946%) 
15: 75313 (7.5313%) 
16: 86536 (8.6536%) 
17: 95082 (9.5082%) 
18: 103440 (10.344%) 
19: 110203 (11.0203%) 
20: 118994 (11.8994%)