Pythonでのランダム化。 彼女はランダムですか?

画像

良い時間、ハブラフチアン。 ポストの深いタイトルにもかかわらず、その本質は、すでに研究された問題を解決することにおける自分自身の愚かさに対する闘争の説明にあります。 最近、私はしばしば「チャンス」のトピックを熟考しました。 この非常に偶然の一致は何ですか? 私は自分ですべてにアクセスするのが好きであるという事実のために-私は検索エンジンには入らず、Pythonに乗り込みました。



まず、次のアルゴリズムが思い浮かびました。

1)いくつかの乱数を取得します。

2)乱数「0」、「1」、「2」などの数を調べます。

3)これらの数値の合計を計算します。

4)明確にするために、図を作成します。

結果は、私の愚かさで、非常に驚​​いた:

画像

ゼロの数が他のすべての数字の数よりも著しく大きいのはなぜですか? 答えは簡単でしたが、彼については少し後で。

私は乱数の数を増やすことを決め、その数が等しくなると事前に疑っていました。

しかし、私が見た写真は恐ろしいものでした:

画像

画像

この後の質問は、「ランダムな」数が次のように生成されるコードにすぐに生じました。

while ii<kol: a = random.random() z = str(a) L = len(z) i = 0 while i <L: if z[i]=="0": s0 +=1 elif z[i]=="1": s1 +=1 elif z[i]=="2": s2 +=1 elif z[i]=="3": s3 +=1 elif z[i]=="4": s4 +=1 elif z[i]=="5": s5 +=1 elif z[i]=="6": s6 +=1 elif z[i]=="7": s7 +=1 elif z[i]=="8": s8 +=1 elif z[i]=="9": s9 +=1 i+=1 ii +=1
      
      





あなたはすでに私の最初の間違いが何であるかを推測したと思いますか? そして、random.random()にあり、特定の小数点以下の桁数を持つ0から1までの乱数を返しました。

これで終わりではありませんでした。 エラーを修正した:

 ... while ii<kol: a = random.random() z = str(a) l = len(z) i = 2 while i <L: if z[i]=="0": s0 +=1 elif z[i]=="1": ...
      
      





次の「ランダム性」の画像を取得しました。

画像

この状況は、数字の数が増えても変わりませんでした。 ただし、ここでの答えは理論上ではなく、実装でもありました。 推測?

実は、Pythonはrandom.random()を使用して取得した数値を丸めます。 丸めでは、「0への丸め」は「他の数値への丸め」よりもはるかに少ないことを理解するのは簡単です。 なぜなら 「0に丸める」ためには、乱数の最後から2桁が9である必要があります。このチャンスは10分の1です。

コードの「修復」:



 while ii<kol: a = random.random() z = str(a) l = len(z) i = 2 while i <L-1: if z[i]=="0": s0 +=1 elif z[i]=="1":
      
      







画像

正義ランダム性が勝利しました。 愚かさは破壊されました。 気をつけて、愛するhabravchane。 この記事を最後まで読んでくれたみんなに感謝します。



All Articles