Вероятность выпадения чисел (rnd)
Написал для ВК бота-игру. Суть игры в том, что игроку даётся полностью рандомное число от 1 до 100, а пользователь угадывает, следующее число будет «больше» или «меньше». От того угадал он или нет, зависит его выигрыш.
Но мы понимаем, что если сперва выпало число 10, значительно выше вероятность того, что следующее случайное число будет «больше».
Кто может подсказать функцию или формулу, при которой независимо от того, выпало число 5 или 50, следующее число с равной вероятностью будет «больше» или «меньше».
Сам код:
def randC():
a = random.randint(1,100)
return(a)
#ГЕНЕРАЦИЯ ОТ 1 до 100
def game(text, id):
if data(id) == 1:
msg = text
id = id
rand0 = randC()
rand = last(id)
sql = "SELECT many FROM game_one WHERE user_id=?"
cursor.execute(sql, [(str(id))])
a = cursor.fetchone()
many = a[0]
if msg.lower() == "начать":
return("Новое число: " + str(rand))
elif msg.lower() == "больше":
if rand0 > rand:
wr = rand0
wrW(wr, id)
mn = many
n = 1
addmoney(mn, n, id)
return("Вы выиграли!" + "\nНовое число: " + str(rand0))
elif rand0 < rand:
wr = rand0
wrW(wr, id)
mn = many
n = 0
addmoney(mn, n, id)
return("Вы проиграли(:" + "\nНовое число: " + str(rand0))
elif msg.lower() == "меньше":
if rand0 < rand:
wr = rand0
wrW(wr, id)
mn = many
n = 1
addmoney(mn, n, id)
return("Вы выиграли!" + "\nНовое число: " + str(rand0))
elif rand0 > rand:
wr = rand0
wrW(wr, id)
mn = many
n = 0
addmoney(mn, n, id)
return("Вы проиграли(:" + "\nНовое число: " + str(rand0))
else:
return("unregistr")
#игра
Ответы (1 шт):
Есть три точки: от_числа | выпавшее_число | до_числа Кидайте рандом дважды: Один чтобы выбрать интервал, от..._число или _число...до, второй - чтобы выбрать число в этом интервале. Можно сделать такую функию:
import random
def randint(start, end, middle = None):
if (middle == None or middle <= start or end <= middle ):
# middle не передали или не попадает в интервал,
# вернется обычный случайный int
return random.randint(start, end)
(end := middle - 1) if random.random() < 0.5 else (start := middle + 1)
# В половине случаев end сократится до middle, в половине - start.
# -1 / +1 исключают повторное выпадение middle.
return random.randint(start, end) # start или end уже получили значение middle
# Тесты
for _ in range(10):
number = randint(1, 100)
print( number, end = " -> " )
x = [0, 0]
for k in range(2000):
n = randint(1, 100, number)
x[ int(n <= number) ] += 1
print( x )
P.s. Изначально надо бы генерировать число 2 - 99, чтобы если вдруг упадет 2 или 99, у них было куда сдвигаться.