5

Как сделать рандомный текст на Python? Чтобы он выводил только 1 переменную из двух? Например, я беру две переменные с таким значением:

import random

role1 = "Мирный житель"
role2 = "Мафия"
role = randon.randomint(role1, role2)

print("Вы - " + role)

input("")

И мне нужно, чтобы при выводе текста выводилась ТОЛЬКО ОДНА ПЕРЕМЕННАЯ. Причем с каждого раза - разная, то role1, то role2, то снова role1.

Надеюсь, понятно объяснил. Я новичок в Python и прошу по подробнее отвечать.

jfs
  • 52,361

3 Answers3

6

Случайный элемент из последовательности

random.choice(seq) использует криптографически-небезопасный PRNG в Питоне, поэтому если вы его используете в контексте, где не желательно, чтобы можно было угадать результат последовательных вызовов, например, при генерации паролей, то следует использовать CSPRNG такой как random.SystemRandom(), который использует os.urandom(), который в свою очередь использует возможности, предоставляемые OS:

#!/usr/bin/env python3
import random

random_item = random.SystemRandom().choice(["Мирный житель", "Мафия"])

See also: PEP 0506 -- Adding A Secrets Module To The Standard Library. secrets модуль доступен с Python 3.6 -- его secrets.choice метод это как раз простой alias для SystemRandom().choice, показанного выше.

Каждый раз разная (неслучайная) строка

Чтобы при каждом запуске программы можно было печатать разные значения из заданной последовательности, можно создать бесконечный итератор, используя itertools.cycle(), который по кругу возвращает элементы из этой последовательности. Чтобы сохранить состояние итератора между запусками программы, чтобы каждый раз следующее значение возвращалось, можно использовать pickle для сериализации:

#!/usr/bin/env python3
"""Print a different string on each run in a loop."""
import itertools
import pathlib
import pickle

load items

path = pathlib.Path('it.pickle') try: data = path.read_bytes() # XXX no file locking, ignore concurrent issues except FileNotFoundError: # 1st run # create an infinite iterator that repeats the values it = itertools.cycle(iter({"Мирный житель", "Мафия"})) else: # NOTE: it is insecure if you can't trust it.pickle's content it = pickle.loads(data)

print next item

print(next(it))

save items

path.write_bytes(pickle.dumps(it)) # XXX ignore data corruption issues

Чтобы избежать (маловероятного) повреждения файла (например, если питание вдруг пропадёт во время записи файла), можно использовать временный файл. See Threadsafe and fault-tolerant file writes.

jfs
  • 52,361
3

Из вопроса не очень понятно, что Вы хотите сделать. "Каждый раз разная" и "рандомная" (т.е. случайная) - это совершенно разные вещи. Поэтому попробуем сделать два варианта.

Вариант 1. Случайная строка.

import random

strings = ['String 1', 'String 2']
print(random.choice(strings))

Вариант 2. Каждый раз разная строка.

def next_string():
    strings = ('String 1', 'String 2')
    next_string.i = (next_string.i + 1) % len(strings)
    return strings[next_string.i]
next_string.i = -1

print(" ".join(next_string() for r in range(10)))

А вот так можно реализовать случай, когда при каждом следующем вызове программа выдаёт следующую строку:

def next_string():
    strings = ('String 1', 'String 2')
    if next_string.i < 0:
        try:
            with open("i.idx", 'r') as file:
                next_string.i = int(file.read())
        except Exception:
            pass
    next_string.i = (next_string.i + 1) % len(strings)
    with open("i.idx", 'w') as file:
        file.write(str(next_string.i))
    return strings[next_string.i]
next_string.i = -1

print(next_string())
0

Если нужно каждый раз рандомное значение, которое при этом бы ещё и не повторялось относительно предыдущих, перемешайте массив данных при помощи random.shuffle() и показывайте последовательно данные из него.

import random

def rand_seq(seq): random.shuffle(seq_ := (seq if isinstance(seq, list) else list(seq))) return iter(seq_)

>>> my_sequence = rand_seq(range(10))
>>> tuple(my_sequence)

(6, 3, 4, 7, 8, 5, 9, 1, 2, 0)
>>> my_sequence = rand_seq("синхрофазотрон")
>>> tuple(my_sequence)

('о', 'с', 'з', 'р', 'ф', 'о', 'х', 'н', 'о', 'т', 'а', 'р', 'и', 'н')