sakrab
@sakrab
Не будь побежден злом, но побеждай зло добром...

Замена числа. Есть функция?

Ребят подскажите, есть функция замены числа, если числа одинаковые?

import random
numberRobot = random.randint(999,9999)
for i numberRobot:
    print i


Если numberRobot = 1234 (разные по значению), то ОК, если 5532, то одну 5 заменить на другое число? Не могу сообразить. Спасибо.
  • Вопрос задан
  • 584 просмотра
Решения вопроса 2
adugin
@adugin Куратор тега Python
''.join(random.sample('0123456789', 4))
Ответ написан
baterson
@baterson
python/django
Задача в том, чтобы число состояло из уникальных цифр? если да то можно перевести его в строку и пройтись через for, заменять через строчный метод replace
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
tsarevfs
@tsarevfs
C++ developer
import random
import math
from collections import deque

def digits2number(digits):
	return int(''.join([str(d) for d in digits]))

unic_digits = deque(range(0, 10))
num_len = 1 + math.floor(math.log(random.randint(1, 10000), 10)) 
random.shuffle(unic_digits)
if (unic_digits[0] == 0):
	unic_digits.rotate(random.randint(1, 9))

print(digits2number(list(unic_digits)[:int(num_len)]))

Как вариант можно генерировать случайное число сразу из уникальных цифр. Количество разрядов можно тоже выбирать случайно, но делать это нужно с осторожностью, иначе короткие числа будут встречаться слишком часто.
num_len = 1 + math.floor(math.log(random.randint(1, 10000), 10))

Так распределение будет похоже на нормальное (мы генерируем "честное" случайное число и берем количество цифр из него).

upd: Еще более простой способ для фиксированной длины.
import random
import math

def digits2number(digits):
  return int(''.join([str(d) for d in digits]))

unic_digits = list(range(10))
num_len = 4 
while not unic_digits[0]:
	unic_digits = random.sample(unic_digits, num_len) 

print(digits2number(unic_digits))
Ответ написан
@IlyasR
Если скорость не критична, то:
def rand(l=4):
    if l > 10 or l < 1:
        return None
    seen = set()
    rlist = []
    while True:
        r = random.randint(0,9)
        seen.add(r)
        rlist.append(r)
        if len(seen) < len(rlist):
            del rlist[-1]
        if len(rlist) >= l:
            break
    return int(''.join(str(e) for e in rlist))


но лучше наверное будет так:
def rand2(l=4):
    if l > 10 or l < 1:
        return None
    choiceList = range(10)
    rlist = []
    while len(rlist)<l and len(choiceList)>0:
        r = random.choice(choiceList)
        rlist.append(r)
        choiceList = list(set(choiceList) - set([r]))
    return int(''.join(str(e) for e in rlist))

исключаем из выборки уже выбранные цифры.
Ответ написан
Комментировать
sakrab
@sakrab Автор вопроса
Не будь побежден злом, но побеждай зло добром...
Наверно не правильно был задан вопрос. Как обычно у новичков - не понятные вопросы =) Вообщем решение которое мне надо было, куда проще :D

Кому интересно:
import random
cash = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(cash)
print("".join(map(str, cash[:4])))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы