2

Trypython.orgを使用していて、ランダムなモジュールが含まれていないことがわかったので、興味がありました。

ランダムをインポートせずに特定の範囲内の乱数を生成する別の方法はありますか?

4

5 に答える 5

2

乱数の生成は難しい必要はありません。難しいのは、独自のメソッドを発明してそれが優れているという証拠を見つけること、または最適化された/安全な/スレッドセーフな/.../実装を作成することです。

これは、 http://en.wikipedia.org/wiki/Random_number_generation#Computational_methodsで説明されているMultiply-with-carryメソッドのPythonバージョンです 。

getuniform()を呼び出すことにより、0から1までの非常に良好で均一な乱数を取得し、必要なサイズにスケーリングするだけです。これは、暗号化または詳細なモンテカルロシミュレーションを除くほとんどの場合に問題ありません。

class myrandom:
    kz=36969
    kw=18000
    k3=65535
    maxz=kz*k3+(2<<16)
    maxw=kw*k3+(2<<16)
    max=(maxz<<16 )+maxw
    # Optionally initiate with different seed. Two numbers below 2<<16
    def __init__(self,z=123456789,w=98764321):
        self.m_w = w
        self.m_z = z
    def step(self):
        self.m_z = self.kz * (self.m_z & self.k3) + (self.m_z >> 16)  
        self.m_w = self.kw * (self.m_w & self.k3) + (self.m_w >> 16)       
    def get(self):
        self.step()
        return (self.m_z << 16) + self.m_w
    def time_reseed(self):
        # yes, sure, move out import if you like to
        import time
        t=int(time.time())
        # completely made up way to got two new numbers below 2<<16
        self.m_z = (self.m_z+(t*34567891011)) & ((2<<16)-1)
        self.m_w = (self.m_w+(t*10987654321)) & ((2<<16)-1)
        self.step()
    def getuniform(self):
        return self.get()*1.0/self.max

例:

myr=myrandom()
print [myr.getuniform() for x in range(20)]

time_reseed()を呼び出すと、time()からの新しいランダム性のビットが状態に追加されます。

于 2012-06-07T12:09:04.653 に答える
2

乱数、またはむしろ疑似乱数を生成することは難しいビジネスであり、デフォルトのライブラリに固執するのが最善です。弾丸をかじってPython2.7.2または3.2.3をダウンロードしてから、trypythonに含まれていない他のライブラリを試してみることをお勧めます。

于 2012-06-07T11:02:04.200 に答える
2

それはかなり醜く、信頼性が低く、それほど速くはありませんが、動作します:

>>> import time
>>> t = time.time()
>>> int(str(t-int(t))[2:])%100 #Keeping only the numbers after the decimal point, otherwise you would get the same "random" number each second
33

ここでの範囲は[0,99]です(モジュロ100を参照)。自己責任で使用してください。

于 2012-06-07T11:07:12.607 に答える
2

ランダム性は些細なことではないので、代替モジュールの代わりに、代わりに代替のオンラインIDEを提案します。

pythonfiddleを見てください。そこで使用する必要のあるコードは次のとおりです。

import random
print random.randint(1, 100)
于 2012-06-07T11:38:58.550 に答える
0

「secrets」モジュールを使用する-これは組み込みモジュールです。importsecretssecrets.random(10)0から10までの数値、またはあなたが評価する値を生成します。

于 2020-04-03T06:30:03.323 に答える