2016-08-08 53 views
1

當編寫這段代碼時,我發現自己做了很多重複的事情,並想知道是否有一個更簡單或更簡單的方法來做重複性的任務如此。獲取整數的出現次數在一個範圍內的隨機數字選擇N次

下面是相關代碼:

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 
+0

工作代碼屬於http://codereview.stackexchange。com/ –

+0

爲什麼在創建可以容納它們的'list'時使用大量變量? – ForceBru

+0

對不起,將在下次發佈到codereview – Kos

回答

2

而不是每個隨機輸出採取命名變量,你可以把字典與每個可能的值作爲關鍵。這將縮短你的代碼,並使其擴展爲任何隨機範圍

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} 
+0

正是我在找的東西!非常感謝 – Kos

+0

我已經使它更具可配置性,其中您可以更改randomMax值並獲得0-> randomMax範圍的結果 – abhinsit

+0

這可行,但需要的時間遠遠長於實際需要的時間。查看我的答案,瞭解不需要重複10000次的恆定時間解決方案。 – James

1

首先,當你發現自己使用噸是滿足同樣的目的(零​​,那些,三三兩兩,等如數字)變量,你幾乎肯定需要一個數組(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

該代碼速度快,不會因爲使用生成器而浪費內存。

+1

我會讓第一行'nums = [0] * 7',看起來更清晰(我真的不明白爲什麼它的範圍(11)在第一位) – James

+0

@詹姆斯,好主意! (這是爲了統計每個數字從零到九的情況,出於某種原因:P) – ForceBru

2

在這裏你去...

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

結果將從[0,1,2,3,4,5,6]開始,這不是提問者想要的結果。 – James

+0

謝謝現在修復。 – karakfa

+0

我喜歡它! –

0

在你的特殊情況,你可以做

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

這個代碼也許會有幫助,計數器詞典將舉行數字作爲鍵,用數字作爲事件的值。

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 
1
>>> from random import randint 
>>> randomnumber = [0,0,0,0,0,0,0] 
>>> i = 0 
>>> while i < 100: 
... random = (randint(0,6)) 
... randomnumber[random] +=1 
... i = i +1 
... 
>>> randomnumber 
[18, 15, 10, 8, 16, 19, 14] 
0

這些回答所有的工作,但他們將採取非常很長的時間循環,實際上你根本不需要使用循環。這裏的代碼,超過一百萬次花費一定的時間,而不是需要循環:

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(有關統計DIS信息

由此產生)

相關問題