【问题标题】:Get count of occurrence of integers in a random number selection in a range N times [duplicate]获取范围内随机数选择中整数的出现次数N次[重复]
【发布时间】:2016-08-08 17:24:35
【问题描述】:

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

以下是相关代码:

 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

【问题讨论】:

  • 工作代码属于codereview.stackexchange.com
  • 既然可以创建一个可以容纳变量的list,为什么还要使用大量变量?
  • 抱歉,下次发到codereview
  • 对于数字a=a+ba+=b 相同
  • 到目前为止的答案大多给出了一个迭代解决方案,但实际上这可以在恒定时间内完成。您无需进行太多迭代即可获得您正在寻找的分布。

标签: python python-3.x simplify


【解决方案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

样本输出:

{0: 1400, 1: 1400, 2: 1500, 3: 1400, 4: 1500, 5: 1000, 6: 1800}

【讨论】:

  • 正是我想要的!非常感谢
  • 我让它变得更加可配置,您可以只更改 randomMax 值并获得 0->randomMax 范围的结果
  • 这可行,但需要的时间远远超过实际需要的时间。请参阅我的答案以获得不需要迭代 10000 次的恒定时间解决方案。
【解决方案2】:

给你...

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

【讨论】:

  • 结果将以 [0,1,2,3,4,5,6] 开始,这不是提问者想要的。
【解决方案3】:

在您的特殊情况下,您可以这样做

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])

【讨论】:

    【解决方案4】:

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

    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
    

    【讨论】:

      【解决方案5】:

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

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

      诚然,这种方法总共会比 1000000 少一点,但它要快得多,而且您还可以在随机数上添加一点,使其实际达到 1000000。

      有关详细信息,请参阅:

      Getting N random numbers that the sum is M

      Random numbers that add to 100: Matlab(有关此生成的统计分布的信息)

      【讨论】:

        【解决方案6】:

        首先,当您发现自己使用大量适合相同目的的变量时(例如,零、一、二等的数量),您几乎肯定需要一个数组(Python 术语中的 list)。

        import random
        
        nums = [0] * 7 # number of digits from zero to six
        
        for i in range(1000001):
            r = random.randint(0, 6) # you can get rid of this variable 
                                     # and use random.randint(0, 6) as an array index
            nums[r] += 1 # each member of a list represents a number of some digit's occurrences
        
        print(''.join("{} -> {}\n".format(a, b) for a, b in zip(range(7), nums)))
        

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

        import random, collections
        
        print(''.join("{} -> {}\n".format(a, b) for a, b in collections.Counter(random.randint(0, 6) for _ in range(100)).items()))
        

        检查this 以了解如何使用collections.Counter 计算列表项的出现次数。

        此代码速度很快,并且使用生成器不会浪费内存。

        【讨论】:

        • 我会做第一行nums = [0] * 7,它看起来更干净(我不明白为什么它首先是范围(11))
        • @James,好主意! (这是为了计算每个数字从零到九的出现次数,出于某种原因:P)
        猜你喜欢
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 1970-01-01
        • 2015-09-16
        • 2012-10-22
        • 2023-03-04
        • 1970-01-01
        相关资源
        最近更新 更多