Python与物理 - 系统的自发性熵减及Python模拟其时间
听起来好傻:学过物理的都知道,根据热力学第二定律,一个孤立系统的熵是递增的。然而,请看下面这个栗子。
把一副纸牌认为是一个孤立系统,54张纸牌最开始有3、4、5、6、7、8、9、10、J、Q、K、A、2的顺序,此时系统有序,熵的值低。然后,随机洗牌,此时系统的熵会增加,因为纸牌没有了上述的顺序。
但是,毕竟洗牌的结果是一个随机事件,也就是说,纸牌洗牌后的结果只是概率问题:在极小的概率下,纸牌有可能在洗牌时变回最开始的顺序,即系统的熵减小了。
只不过,这个概率极小,其值为54!-1(约等于4.3319354677×10-72,约合0.00000…000(小数点后共71个零)43319354677)。但是,概率小不等于不可能,纸牌系统的熵是有可能自发性地降低的。
用计算机模拟洗牌,最后给出试验的次数和所耗时间。由于54张牌需要时间太长,给出9张牌的试验(P(x)=362880, E(x)=181440)。Python实现如下:
import time
import random
_all = [str(num) for num in range(1, 10)] # 从1到9
def test():
test_all = _all.copy()
def get_num():
number = test_all[random.randint(0, test_all.__len__() - 1)]
index = 0
for num in test_all:
if num == number:
del num[index]
break
index += 1
# 简便写法忘了
return number
result = []
for i in range(9):
result.append(get_num())
return result
i = 1
start = time.time()
while True:
r = test()
print('Test Information\nNumber: {}\nResult: {}\nOrdered:{}\nSucceed: {}\n\n\n'.format(i, ', '.join(r), ', '.join(_all), r == _all))
if r == _all:
break
i += 1
end = time.time()
print('Test has ended. Number of tests: {}, it took {} seconds.'.format(i, end - start))