一、隨機算法求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