python 用于生成伪随机数的LCG(线性同余生成器)的Python实现。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 用于生成伪随机数的LCG(线性同余生成器)的Python实现。相关的知识,希望对你有一定的参考价值。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import random as rnd
import numpy as np
from PIL import Image
from itertools import cycle


def main():
    # Input paramentri di lcg
    m = int(input("Inserire il valore di m: "))
    a = int(input("Inserire il valore di a: "))
    c = int(input("Inserire il valore di c: "))
    seed = rnd.randint(0, m - 1)

    # Genera e visualizza la sequenza di m-1 valori
    sequenza = genera_sequenza(m, a, c, seed, count=m, full=False, check=False)
    print("Seme: " + str(seed))
    print(sequenza)

    # Visualizzazione pattern mediante un'immagine
    old_min = min(sequenza)
    old_max = max(sequenza)
    new_min = 0
    new_max = 255

    # Normalizzazione dei valori [0 - 255]
    values = [((x - old_min) * (new_max - new_min) / (old_max - old_min)) + new_min for x in sequenza]

    row = cycle(values)
    arr_img = np.array([[row.next() for i in range(0, 301)]] * 300)
    img = Image.fromarray(arr_img)
    img.show("Generatore lineare congruenziale")


def genera_sequenza(m, a, c, seed, count, full=True, check=True):
    seq = []
    xn = seed

    if check:
        if m < 0 or a >= m or a <= 0 or c >= m or c < 0:
            return None

    if full:
        if mcd(c, m) != 1 or not divisibile_fattori_primi(a-1, m) or not ((a - 1) % 4 == 0 and m % 4 == 0):
            return None

    generatore = lcg(m, a, c, seed)

    for i in range(count):
        seq.append(generatore.next())

    return seq


def lcg(m, a, c, seed):
    _xn = seed

    while True:
        yield _xn
        _xn = (a * _xn + c) % m  # Et voilà!


def mcd(a, b):
    while b != 0:
        resto = a % b
        a = b
        b = resto

    return a


def fattori_primi(n):
    fatt = []
    d = 2

    while d*d <= n:
        while n % d == 0:
            fatt.append(d)
            n /= d
        d += 1

    if n > 1:
        fatt.append(n)

    return fatt


def divisibile_fattori_primi(a, b):
    fatt_primi = fattori_primi(b)

    for i in fatt_primi:
        if a % i != 0:
            return False

    return True


if __name__ == "__main__":
    main()

以上是关于python 用于生成伪随机数的LCG(线性同余生成器)的Python实现。的主要内容,如果未能解决你的问题,请参考以下文章

Python蒙特卡洛模拟 | LCG 算法 | 马特赛特旋转算法 | Random 模块

LCG(linear congruential generator): 一种简单的随机数生成算法

固定密度为 1s 的伪随机数生成器

线性同余法的伪随机数

解密随机数生成器——从java源码看线性同余算法(转)

解密随机数生成器——从java源码看线性同余算法