1から100までの25個の乱数から、最高の乱数が複数回出現する確率はどのくらいですか?


23

多くのオンラインゲームでは、プレーヤーが難しいタスクを完了すると、タスクを完了した全員が使用できる特別な報酬が与えられることがあります。これは通常、マウント(輸送方法)または別のバニティアイテム(キャラクターのパフォーマンスを向上させず、外観のカスタマイズに主に使用されるアイテム)です。

そのような報酬が与えられた場合、誰が報酬を受け取るかを決定する最も一般的な方法は乱数を使用することです。ゲームには通常、1〜100のランダムな(暗号化セキュアランダムではなく、擬似ランダムのような)数を生成する特別なコマンドがあります(プレイヤーは別のスプレッドを選択できますが、100が最も一般的です)。各プレイヤーはこのコマンドを使用し、すべてのプレイヤーは誰が何をロールしたかを見ることができ、アイテムは最高のロールをした人に授与されます。ほとんどのゲームには、プレイヤーがボタンを押すだけで、誰もがボタンを押すと、ゲームが残りを自動的に行う組み込みシステムもあります。

時には、同じ高い数字を生成するプレイヤーもいますが、誰も彼らを倒しません。これは通常、一意の最高の数字が出るまで、プレイヤーが数字を再生成することで解決されます。

私の質問は次のとおりです。同じ確率で1〜100の任意の数を生成できる乱数ジェネレーターを想定します。25人のプレーヤーのグループがあり、それぞれがそのような乱数ジェネレーター(それぞれ独自のシード)で1つの数値を生成すると仮定します。1〜100の25個の数字があり、特定の数のプレーヤーを転がす人数に制限はなく、数字間に関係はありません。最大の生成数が複数のプレイヤーによって生成される可能性は何ですか?言い換えれば、同点の可能性は何ですか?


7
World of Warcraftえ?
— Behacad

1
質問で述べたように、はい、それは、一様乱数です(1と100 inclusinveの間の任意の数は同じ確率を持っている。
— Nzall

良い質問ですが、これは勝者を選ぶのに悪い方法だと思います。プレーヤーを何らかの方法でリストし(「名前のアルファベット順」と言うか、シャッフルして全員にリストを表示するか、他の方法で並べ替えることができます)、1から25までの乱数を選択します。プレーヤーに対応する番号が勝ちます。
— ティムS.

2
いいえ、DKPを使用してください!
— Davor

2
提案:U { 1 、… 、100 }からランダムサンプル与えられた場合、理論からわかったことを使用してを計算する必要があります。オーダー統計の。バツ1、…、バツ25うん{1、…、100}P(バツ(24)<バツ(25))
— 禅14年

回答:


25

させて

  • x = 100バツは範囲の上端、場合はです。バツ=100
  • n = 25nはドローの総数で、です。n=25

任意の数のの配列の数nはシーケンス内の各番号の数字≤ yがあるY N。これらのシーケンスのうち、y s を含まない数は(y − 1 )nであり、1つのyを含む数はn (y − 1 )n − 1です。したがって、2つ以上のy sを持つシーケンスの数は、 y n − (y − 1 )n − ny≤バツn≤yyny(y−1)nyn(y−1)n−1y少なくとも2つの yを含む最大数 yのn個 のシーケンスの総数は、 x ∑ y = 1(y n − (y − 1 )n − n (y − 1 )n − 1)

yn−(y−1)n−n(y−1)n−1
nyy
∑y=1バツ(yn−(y−1)n−n(y−1)n−1)=∑y=1バツyn−∑y=1バツ(y−1)n−∑y=1バツn(y−1)n−1=バツn−n∑y=1バツ(y−1)n−1=バツn−n∑y=1バツ−1yn−1

シーケンスの総数は単純にです。全ての配列は、同様に可能性が高いと確率であるようである X N - N Σ Y = X - 1 、Y = 1、Y N - 1バツn

バツn−n∑y=1y=バツ−1yn−1バツn

では私は確率0.120004212454を作ります。バツ=100、n=25

バツ、n

import itertools
import numpy.random as np

def countinlist(x, n):
    count = 0
    total = 0
    for perm in itertools.product(range(1, x+1), repeat=n):
        total += 1
        if perm.count(max(perm)) > 1:
            count += 1

    print "Counting: x", x, "n", n, "total", total, "count", count

def simulate(x,n,N):
    count = 0
    for i in range(N):
        perm = np.randint(x, size=n)
        m = max(perm)
        if sum(perm==m) > 1:
            count += 1
    print "Simulation: x", x, "n", n, "total", N, "count", count, "prob", count/float(N)

x=100
n=25
N = 1000000 # number of trials in simulation

#countinlist(x,n) # only call this for reasonably small x and n!!!!
simulate(x,n,N)
formula = x**n - n*sum([i**(n-1) for i in range(x)])
print "Formula count", formula, "out of", x**n, "probability", float(formula) / x**n

このプログラムは出力しました

Simulation: x 100 n 25 total 1000000 count 120071 prob 0.120071
Formula count 12000421245360277498241319178764675560017783666750 out of 100000000000000000000000000000000000000000000000000 probability 0.120004212454

2
2000000.11957

バツn

perlを使用してシミュレートすると、非常に一貫した0.005 が得られました。pastebin.com/gb7JMLt6
— agweber

バツnバツ=20、n=515600/160000=0.0975バツ、n、および導出された式Iからの確率。私たちのコード間の不一致の原因は何かを知りたいです。
— TooTone

4
1070.119983、n = 10^7; Total[Boole[Equal @@ (#[[Ordering[#, -2]]])] & /@ x = RandomInteger[{1, 100}, {n, 25}]] / n

3

最初にユニークな勝者がいる確率を見つけることを検討します

バツ(251)(バツ−1)2410025y−1

勝者は2から100に等しい数で勝つことができるため、合計確率は

∑私=210025(私−1)2410025=25∑私=199私2410025=−14+25∑私=1100私2410025≈−14+25124+110024+1+1210024+242161002310025=0.88

10023

1−0.88=0.12


-3

p1−pp=1∗(1−1/100)∗(1−1/100)。。。。。。∗(1−1/10)=(1−1/100)24P=1−p=1−(1−1/100)24=0.214


これは、確率が21.4%であることを意味しますか?かなり高いように見えますが、誕生日の逆説にも同様の驚くべき答えがあります。ありがとう。
— Nzall

6
-1現状では、この答えは正しくありません。正しい答えは@TooToneによって提供されました。
— COOLSerdash
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.