随机掷骰子:我的方法有缺陷还是我想得太多了?

2024-10-04 05:24:14 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我只是在玩弄如何使用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"))

Tags: ofnumbersizerandomdicelistbitsint
1条回答
网友
1楼 · 发布于 2024-10-04 05:24:14

你的最后陈述是错误的:对于一个完全公平的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的差异在预期范围内

我建议您尝试运行卡方检验,而不是简单的最大/最小度量

相关问题 更多 >