Python 获取N次范围内随机数选择中整数出现的计数

Python 获取N次范围内随机数选择中整数出现的计数,python,python-3.x,simplify,Python,Python 3.x,Simplify,在编写这段代码时,我发现自己做了很多重复的事情,并且想知道是否有更简单、更简单或更短的方法来完成这样的重复任务 以下是相关代码: from random import randint RandomNumber = Zeroes = Ones = Twos = Threes = Fours = Fives = Sixes = i = 0 while i < 1000000: RandomNumber = (randint(0,6)) if

在编写这段代码时,我发现自己做了很多重复的事情,并且想知道是否有更简单、更简单或更短的方法来完成这样的重复任务

以下是相关代码:

 from random import randint
    RandomNumber = Zeroes = Ones = Twos = Threes = Fours = Fives = Sixes = i = 0

    while i < 1000000:
        RandomNumber = (randint(0,6))
        if RandomNumber == 0:
            Zeroes = Zeroes + 1
        if RandomNumber == 1:
            Ones = Ones + 1
        if RandomNumber == 2:
            Twos = Twos + 1
        if RandomNumber == 3:
            Threes = Threes + 1
        if RandomNumber == 4:
            Fours = Fours + 1
        if RandomNumber == 5:
            Fives = Fives + 1
        if RandomNumber == 6:
            Sixes = Sixes + 1

        i = i + 1
来自随机导入randint
随机数=零=一=二=三=四=五=六=i=0
当我<1000000时:
随机数=(随机数(0,6))
如果RandomNumber==0:
零=零+1
如果RandomNumber==1:
一=一+1
如果RandomNumber==2:
Twos=Twos+1
如果RandomNumber==3:
三个=三个+1
如果RandomNumber==4:
四个=四个+1
如果RandomNumber==5:
五个=五个+1
如果RandomNumber==6:
六个=六个+1
i=i+1

首先,当您发现自己使用了大量适合相同用途的变量(例如,0、1、2等的数量)时,几乎肯定需要一个数组(Python术语中的
列表


如果您想要的东西非常短、快速、强大:

import random, collections

print(''.join("{} -> {}\n".format(a, b) for a, b in collections.Counter(random.randint(0, 6) for _ in range(100)).items()))
查看如何使用
集合计算列表中项目的出现次数。计数器

这段代码速度很快,不会因为使用生成器而浪费内存。

给你

from random import randint
outcomes=[0]*7
for i in range(1000000):
    outcomes[randint(0,6)]+=1

在你的特殊情况下,你可以

from random import randint
results=[0]*7 # same as [0,0,0,0,0,0,0]

i=0
while i < 1000000:
    n = randint(0,6)
    results[n]+=1
    i+=1

for i in range(len(results)):
    print(i, results[i])
来自随机导入randint
结果=[0]*7#与[0,0,0,0,0,0,0]相同
i=0
当我<1000000时:
n=randint(0,6)
结果[n]+=1
i+=1
对于范围内的i(len(结果)):
打印(i,结果[i])

此代码可能会有所帮助,计数器字典将数字作为键,数字出现作为值

from random import randint

counter = {}

while i < 1000000:
    RandomNumber = (randint(0,6))
    if RandomNumber in counter:
        counter[RandomNumber] += 1
    else:
        counter[RandomNumber] = 1

    i += 1
来自随机导入randint
计数器={}
当我<1000000时:
随机数=(随机数(0,6))
如果计数器中有随机数字:
计数器[随机数]+=1
其他:
计数器[随机数]=1
i+=1

您可以使用字典和每个可能的值作为键,而不是为每个随机输出获取命名变量。这将缩短您的代码,并使其可扩展为任何随机范围

from random import randint
randomMax = 6
randomList= {i:0 for i in range(0,randomMax+1)}
totalIterations = 10000
while totalIterations >0:
    randomList[randint(0,randomMax)]+=1
    totalIterations-=1
样本输出:


这些答案都是有效的,但它们需要很长时间才能循环,而实际上根本不需要使用循环。下面的代码需要固定的时间,而不需要循环一百万次:

from random import random

nums = [random() for _ in range(7)]
nums = [int((x / sum(nums)) * 1000000) for x in nums]
诚然,这种方法总共会减少1000000个,但它的速度要快得多,而且你也可以在随机的方法中增加一点,使其实际达到1000000个

有关详细信息,请参阅:


(有关由此产生的统计分布的信息)

工作代码是关于当您可以创建一个可以容纳变量的
列表时,为什么要使用大量变量?对不起,下一次将发布到codereview,因为数字
a=a+b
a+=b
相同,目前为止的答案大多给出了一个迭代的解决方案,但实际上,这可以在固定的时间内完成。你不需要迭代那么多就可以得到你想要的分布。结果将以[0,1,2,3,4,5,6]开始,这不是询问者想要的。我会做第一行
nums=[0]*7
,看起来更干净(我真的不明白为什么它一开始是范围(11))@James,好主意!(这是为了计算从0到9的每个数字的出现次数,出于某种原因:P)这正是我要找的!非常感谢您,我已经使它更具可配置性,您只需更改randomMax值,即可获得0->randomMax Range的结果。这项工作正常,但所需时间远远超过实际需要的时间。请参阅我的答案,了解不需要迭代10000次的常数时间解决方案。
{0: 1400, 1: 1400, 2: 1500, 3: 1400, 4: 1500, 5: 1000, 6: 1800}
from random import random

nums = [random() for _ in range(7)]
nums = [int((x / sum(nums)) * 1000000) for x in nums]