dennyА что же Вы хотели? Переменная
equi есть случайная величина и поэтому для получения приблизительно точного значения, надо выполнить некоторое количество прогонов в каждом из которых по 1000000000 генераций случайного числа. И по результатам получить среднее значение. А Вы сделали всего один, но этого не достаточно.
Вообще то мне ваш подход не совсем был понятен. Поэтому я открыл литературу (книжку "Математика в современном мире"). Там про это было несколько по другому написано.
Есть три урны (А, В, С), в третьей урне С находятся номера шаров. В начале эксперимента все пронумерованные шары лежат в урне А. Затем последовательно, случайным образом вынимаются номера по одному. Шар с вынутым номером перекладывается из одной урны в другую, а вынутый номер возвращается обратно в свою урну. Соответственно этому описанию, я сделал алгоритм на питоне версии 3.10, который привожу ниже
import random
def erenfest(m,N):
numBalance = 0
lstMol = [1 for i in range(0,N)]
nAA = len(lstMol); nBB = 0
lstNumbAA = []; lstNumbBB = []
for i in range(0,m):
k = random.randint(0, N-1)
#print(k)
if lstMol[k] == 1:
lstMol[k] = 0
nAA -= 1
nBB += 1
elif lstMol[k] == 0:
lstMol[k] = 1
nBB -= 1
nAA += 1
if nAA == nBB:
numBalance += 1
return numBalance
m = 200000000
N = 16384 # количество шаров
lstNumBal = []
pn = 10
for j in range(0,pn):
print("--- j ", j)
numBalance = erenfest(m,N)
print("numBalance ", numBalance)
lstNumBal.append(numBalance)
numBalSred = sum(lstNumBal)/len(lstNumBal)
print("sred numBal ", numBalSred)
pisr = (m/numBalSred)**2 *2 /N
print("pisr ", pisr)
В алгоритме используются следующие переменные:
--- кол-во шаров в урне А и В соответственно;
--- список меток шаров:
когда k-й шар лежит в урне А и
когда k-й шар лежит в урне В;
--- количество случаев, когда числа шаров в урнах совпадают;
---- количество выполненных экспериментов в одной серии;
---- число прогонов в эксперименте.
Сначала я выполнил две серии экспериментов (
) по 5 в каждой, получил 3.1518 и 3.20786, затем выполнил серию из 10 экспериментов (
) получил 3.1663.
Похоже, что генератор случайных чисел не очень хорош, потому что рядом стоящие числа, мало отличаются друг от друга. К сожалению повторить расчеты с большим значением
или большое число серий я не могу из-за занятости да и python не позволяет. У Вас возможностей больше, поэтому как говорится, "Вам и карты в руки".