#python #random #numbers
Вопрос:
В настоящее время я кодирую игру «Тузы в мешанине». В этой игре компьютер должен сгенерировать 4-значное число без повторяющихся цифр, и пользователю нужно выяснить, что это за число. Мой вопрос: «Как мне проверить, есть ли в случайном числе повторяющаяся цифра? Например, 4444 содержит повторяющиеся цифры, а 4321-нет.
Комментарии:
1. Привет, Бритни, и добро пожаловать в stackoverflow. Вы обнаружите, что люди здесь очень разборчивы в том, как задаются вопросы. Вы всегда должны публиковать то, что вы пробовали до сих пор.
2. Лучшим способом было бы создать свой список
[1,2,3,4]
, а затем использоватьrandom.shuffle
его для их перестановки. Таких чисел всего 24, поэтому генерировать случайное число меньше 10 000 и проверять его было бы ужасно расточительно.
Ответ №1:
Вероятно, лучше всего сделать это, чтобы нарисовать 4 числа без замены из диапазона от 0 до 9 включительно.
Затем сложите их в удобном порядке, чтобы получить число в диапазоне тысяч:
from random import sample
num1 = int(''.join(sample("0123456789", k=4))))
num2 = sum(10**k*v for k,v in enumerate(sample(range(10), k=4)))
и то, и другое решило бы эту проблему.
sample
является ли «ничья без замены» — см. документы- подведение итогов можно выполнить в строках с помощью простого соединения str. (а затем преобразовать в int) -> см.
num1
- или путем перечисления полученного списка целых чисел и умножения каждой цифры на 1000, 100, 10, 1 перед суммированием -> см.
num2
A random.shuffle()
также было бы возможно, но требуется больше строк кода, так как перетасовка выполняется на месте и возвращает None
:
from random import shuffle
data = [0,1,2,3,4,5,6,7,8,9]
shuffle(data)
n = sum(10**k*v for k,v in enumerate(data[:4]))
Ответ №2:
Если ваша цель-просто проверить, уникальны ли четыре цифры, вы можете сделать это с помощью простой функции:
def uniq4(num):
return len(set(list(str(num)))) == 4
Это преобразует число в строку, затем в список отдельных символов, помещает их в набор (что требует уникальности), затем проверяет, содержит ли набор 4 значения.
Вы могли бы сделать это более общим, удалив жесткое значение 4 и передав целевое количество цифр в качестве аргумента с соответствующей проверкой, что оно не может быть больше 10 (или меньше 1).
Как отмечали другие, возможно, было бы лучше создать значения, гарантирующие уникальность.
Ответ №3:
Вы можете использовать тип данных Python, чтобы помочь вам очень простым способом.
- Вы преобразуете свой номер в строку
- Вы создаете набор с каждым символом вашей строки (наборы не допускают дублирования значений).
- Вы проверяете, равна ли длина вашего набора 4, если это правда, у вас есть 4 разных числа! Поздравляю!
Вы можете быть сбиты с толку, но, как и многие вещи на python, это очень просто. Посмотри
import random
n = random.randint(1000,9999)
print(n)
if len(set(str(n))) == 4:
print(True)
else:
print(False)
Если вы хотите убедиться, что ваш код всегда содержит номер без дубликатов, вы можете исправить def
это следующим образом.
import random
def number_without_duplicates():
n = random.randint(1000,9999)
while len(set(str(n))) != 4:
n = random.randint(1000,9999)
return(n)
# to try it
for n in range(10):
print(number_without_duplicates())
Ответ №4:
Если я правильно понял, вы хотите увидеть, повторяется ли цифра в 4-значном целочисленном числе.
Это мое наивное решение этой проблемы. Я бы создал str
объект из int
list
этого , а затем set
из него. Наконец, сравните то len
из того set
с тем len
из того list
. Либо они имеют одинаковую длину, либо есть какая-то повторяющаяся цифра.
def distinct_digits(number):
digits_string = str(number)
digits_list = list(digits_string) #You can't list() an int
digits_set = set(digits_list) #This datatype gets rid of duplicates
return digit_set == digit_list #Think bool() the equality
Приведенная выше функция возвращает True
, если все цифры различны, и False
в противном случае.
Теперь, если вы хотите узнать, какая цифра повторяется. Я могу придумать эту наивную реализацию :
def find_repeating_digit(number):
digits_string = str(number)
digits_list = list(digits_string)
buffer_list = [] #First digit will go here, afterwards the comparison begins
duplicates_list = [] #If there's any duplicate digit, it will go here
for digit in digits_list:
if digit in buffer_list: #Is digit already in buffer list?
duplicates_list.append(digit) #Yes, so off to duplicates_list with it
else: #Otherwise keep on appending digits to the buffer
buffer_list.append(digit)
return duplicates_list
Приведенная выше функция возвращает a list
дубликатов. Если их нет, то это будет пустой список.
Я надеюсь, что код не слишком многословен для вас. Мое намерение состоит в том, чтобы быть как можно более ясным и оставаться верным трем стихам Дзен Питона.
Кроме того, не стесняйтесь играть с этими двумя функциями, возвращайте им значения других типов данных (например, Преобразуйте дубликат обратно в int, Контролируйте поток вывода и т. Д., Ваша оперативная память-это предел).