一、随机算法求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