2017-01-27 5 views
-1

Я использую генератор случайных чисел для выбора вопроса из списка в случайном порядке, если вопрос уже был дан, он должен пропустить и перезапустить, пока не получит номер который еще не был дан.RNG должен игнорировать числа, которые уже были предоставлены [Python]

Работает до тех пор, пока варианты не станут слишком ограниченными. Он будет рулон ~ 4 раза. Если у него все еще нет номера, который ранее не был указан, он выдаст ошибку «индекс за пределами диапазона».

Пример:

from random import randint 
counter = 0 # Max value, count the amount of questions in the list 
done = [] # Already been rolled, ignore these values 
list = open('questions.txt').readlines() 

for l in list: 
    counter +=1 

try: 
    # While there are less values in <done> than <counter>, roll and add to list 
    while len(done) < counter: 
     question = randint(1,counter) 
     while question in done: 
      print('Skipped [%i]' % question) # Check if ignored 
      question = randint(1,counter) # Reroll 
     else: 
      # Add to list so it knows the question has already been asked 
      done.append(question) # Add to list with given values 
    else: 
     print('Finished!\n') 
except Exception as e: 
    print(e) # Show error if any 

Я понятия не имею, что я сделал неправильно, пожалуйста, помогите.

Спасибо :)

+0

Вы должны использовать 'random.sample', между прочим. – TigerhawkT3

+1

Термин, который вы ищете, это «перетасовка». Используйте 'random.shuffle', а затем просто поместите элементы. – jamesdlin

+1

'random.randint()' включает обе конечные точки. Поэтому иногда вы получаете последнюю точку: вне диапазона. Используйте 'randrange()', или, лучше проверить выше комментарии, чтобы быть действительно pythonic. –

ответ

1

Решение может быть еще проще, вы на самом деле не нужен ваш счетчик.

Допустим, у вас есть список вопрос:

import random 
questions = ['how are you ?', 'happy now ?', 'Another question ?'] 

Тогда вы будете печатать один из этих вопросов:

question = random.choice(foo) 
print question 

Тогда просто удалите его из списка:

# del questions[questions.index(question)] 
questions.remove(question) 

Здесь вы идете! ;)

+1

Использование shuffle более эффективно, чем удаление элементов внутри списка, потому что, когда вы удаляете любой элемент, кроме последнего, все последующие элементы должны быть перемещены вниз. Конечно, эта операция выполняется быстро, потому что это происходит на скорости C, но все равно расточительно это делать, если вам это действительно не нужно. Кроме того, при выполнении 'questions.index (question)' необходимо выполнить линейное сканирование списка, чтобы найти элемент. –

+2

И 'del questions [question.index (question)]' is 'questions.remove (question)'. – TigerhawkT3

+0

@ PM2Ring Я не понимаю, почему использование shuffle будет лучше? На самом деле, нам нужно выбрать один вопрос, который не нужно повторять. Поэтому даже используя 'shuffle', нам нужно будет выбрать вопрос, а затем удалить его из исходного списка. – iFlo