5

私は、コイントスと生成実行のモンテカルロ型シミュレーションに使用する LCG 関数を Python で作成しています。私が直面している問題は、乱数のリストを生成すると、奇数と偶数が交互になるように数値がパターン化されることです。それが LCG 関数自体の特性なのか、数値の生成方法の間違いなのかはわかりません。

これが私のコードです:

def seedLCG(initVal):
    global rand
    rand = initVal

def lcg():
    a = 1140671485
    c = 128201163
    m = 2**24
    global rand
    rand = (a*rand + c) % m
    return rand

seedLCG(1)

for i in range(10):
    print lcg()

返される値:

10581448
11595891
1502322
14136437
11348076
1403015
9622582
11013417
11529808
15836891

int と long は Python によって必要に応じて交換されるため、オーバーフローとサイズについて心配する必要はないと思います。

4

3 に答える 3

4

パーティーには少し遅れましたが、他の人にとっては興味深いかもしれません. Python 3 では、次の 2 つの関数を定義することで疑似乱数ジェネレータを構築できます。

def lcg(x, a, c, m):
    while True:
        x = (a * x + c) % m
        yield x


def random_uniform_sample(n, interval, seed=0):
    a, c, m = 1103515245, 12345, 2 ** 31
    bsdrand = lcg(seed, a, c, m)

    lower, upper = interval[0], interval[1]
    sample = []

    for i in range(n):
        observation = (upper - lower) * (next(bsdrand) / (2 ** 31 - 1)) + lower
        sample.append(round(observation))

    return sample

最初の関数はジェネレータとして実装された実際の LCG (つまり、反復可能なオブジェクトを返す関数) であり、2 番目の関数はジェネレータ オブジェクトを反復処理してサンプルを取得します。後者の関数は通常、特定の間隔内で疑似乱数を生成するためにエンド ユーザーによって呼び出されます。

両方の関数を定義した後、次のように使用できます。

# 30 numbers between 0 and 100
rus = random_uniform_sample(30, [0, 100])
print(rus)

出力:

[0, 66, 30, 67, 11, 52, 49, 60, 37, 26, 37, 83, 17, 30, 64, 79, 99, 80, 46, 54, 63, 25, 70, 72, 98, 33, 45, 71, 74, 17]
于 2019-11-14T22:19:08.900 に答える