因此,我只是在玩弄如何使用random.getrandbits()
和此处所述的“浪费”方法制作“掷骰子辊”:
我的代码似乎运行良好,但当我滚动D6时,最大/最小比率为1.004。。。范围,但与D100的它是在1.05。。。范围考虑到我的数据集只有大约一百万卷,这是可以的还是random
的pRNG性质会影响结果?或者我只是个白痴,过度思考,这是因为D100的值范围比D6大
编辑:最大/最小比率是最常见结果的频率除以最不常见结果的频率。对于一个完全公平的骰子,这应该是1
from math import ceil, log2
from random import getrandbits
def wasteful_die(dice_size: int):
#Generate minumum binary number greater than or equal to dice_size number of random bits
bits = getrandbits(ceil(log2(dice_size)))
#If bits is a valid number (i.e. its not greater than dice_size), yeild
if bits < dice_size:
yield 1 + bits
def generate_rolls(dice_size: int, number_of_rolls: int) -> list:
#Store the results
list_of_numbers = []
#Command line activity indicator
print('Rolling '+f'{number_of_rolls:,}'+' D'+str(dice_size)+'s',end='',flush=True)
activityIndicator = 0
#As this is a wasteful algorithm, keep rolling until you have the desired number of valid rolls.
while len(list_of_numbers) < number_of_rolls:
#Print a period every 1000 attempts
if activityIndicator % 1000 == 0:
print('.',end='',flush=True)
#Build up the list of rolls with valid rolls.
for value in wasteful_die(dice_size):
list_of_numbers.append(value)
activityIndicator+=1
print(' ',flush=True)
#Use list slice just in case something wrong.
return list_of_numbers[0:number_of_rolls]
#Rolls one million, fourty eight thousand, five hundred and seventy six D6s
print(generate_rolls(6, 1048576), file=open("RollsD6.txt", "w"))
#Rolls one million, fourty eight thousand, five hundred and seventy six D100
print(generate_rolls(100, 1048576), file=open("RollsD100.txt", "w"))
你的最后陈述是错误的:对于一个完全公平的douse(永远不要说die:-),比率应该趋向于到1.0,但是对于大量的卷,应该很少直接落在该值上。要定期命中1.0,模具需要知道以前掷骰的历史,这违反了公平原则
D6的0.4%变化在10^6卷上是合理的,D100的0.5%也是合理的。正如您所猜测的,这是因为D100有更多的“桶”(不同的值)
D6的平均值为10^6/6,即每个“bucket”大约170K个预期实例。D100每个桶只有10K个预期实例:对于影响数字的中心趋势法则来说,空间稍微小一些。在一次测试运行中有50:4的差异在预期范围内
我建议您尝试运行卡方检验,而不是简单的最大/最小度量
相关问题 更多 >
编程相关推荐