2016-08-08 4 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

Зачем использовать тонну переменных, когда вы можете создать «список», который мог бы их удерживать? – 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 range – abhinsit

+0

Это работает, но занимает гораздо больше времени, чем на самом деле необходимо. См. Мой ответ для решения с постоянным временем, которое не требует повторения 10000 раз. – James

1

Во-первых, когда вы будете использовать тонны переменных, которые подходят для той же цели (например, число нулей, единиц, двоек, и т.д.), вы почти наверняка нужен array (a list в терминологии Python).

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

@James, хорошая идея! (Это было, чтобы подсчитать вхождения каждой цифры от нуля до девяти, по какой-то причине: 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 (для получения информации о статистических дис что это создает)

 Смежные вопросы

  • Нет связанных вопросов^_^