隨機算法求pi、線性同餘法求random、拉斯維加斯算法python

一、隨機算法求pi

在這裏插入圖片描述

# 計算圓周率
import pdb
import random
def CalcPai(n):
    # 計算π值
    k = 0
    for i in range(0,n):
        x = random.random()
        y = random.random()
        if x**2 + y**2 <= 1:
            k = k +1
    print(format(4 * k / n, '.2f'))
if __name__ == '__main__':
    print('請輸入n:')
    n = input()
    n = int(n)
    CalcPai(n)

二、線性同餘法求random

在這裏插入圖片描述

# 計算圓周率
import pdb

def RandomCalc(x0 , a , m , b):
    return (a * x0 + b) % m
def CalcPai(n):
    # 計算π值
    k = 0
    x = 0
    y = 0
    m = 99999999999
    a = 999
    b = 5
    for i in range(0, n):
        x = RandomCalc(y , a , m , b)
        y = RandomCalc(x , a , m , b)
        if x ** 2 + y ** 2 <= m**2:
            k = k + 1
    print(format(4 * k / n, '.2f'))
if __name__ == '__main__':
    print('請輸入n:')
    n = input()
    n = int(n)
    CalcPai(n)

三、拉斯維加斯算法求解n後問題

拉斯維加斯算法 :能夠顯著地改進算法的有效性,甚至對於沒有有效確定性算法的問題,也可以得到滿意的結果。
典型調用形式: bool success = LV(x,&y); 其中x是輸入參數,當success的值爲true時,返回問題的解y 當success的值爲false時,算法未能找到問題的一個解。此時可對同一實例重新調用相同的算法來求解。

import pdb
import random

def Place(k):
    # 注意:k從索引0開始
    for j in range(k):
        if abs(k - j) == abs(rect[k] - rect[j]) or rect[k] == rect[j]:
            return False
    return True

def QueensLV(n):  # 返回一個bool值,得到解返回True,否則False
    # 完善你的代碼
    k = 0  # 第一個 索引爲0
    rect[k] = random.randint(0, n)
    while(Place(k)):
        if k == n-1:
            print(rect)
            return True
        k = k + 1
        rect[k] = random.randint(0, n)
    return False

if __name__ == '__main__':
    n = input()
    n = int(n)
    rect = [0 for i in range(n)]
    print('輸入:', str(rect))
    errorcount = 0  # 失敗次數
    while (not QueensLV(n)):
        # print('false')
        errorcount = errorcount + 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章