Ответ на комментарий ниже от ОП:
Я не уверен, сколько случайности вы получите, как это, но:
def three_to_100_b():
a3 = random.randint(0,1)
a2 = random.randint(0,50)
a1 = 100-a3-a2
return a1, a2, a3
даст вам три псевдо - случайные числа, первое в диапазоне 0-100, второе в диапазоне 0-50, последнее 0 или 1 и суммирование 100.
Но обратите внимание, что случайность между a1
и a2
действительно маленький --- они находятся по прямой линии +0 или -1 по определению ...
Обратите внимание, новыйответ --- у старого есть недостатки в случайности.
Один из способов иметь три числа на сумму до 100 состоит в том, чтобы сгенерировать три случайных числа, а затем масштабировать их так, чтобы их суммы были равны 100. Это слишкоммногословно, но идея такова:
#! /usr/bin/env python3
import random
def three_to_100():
r1 = random.randint(0,100)
r2 = random.randint(0,100)
r3 = random.randint(0,100)
a1 = r1*100/(r1+r2+r3)
a2 = r2*100/(r1+r2+r3)
a3 = 100 - a1 - a2
return a1, a2,a3
#main
print("x\t y\t z")
for i in range(1000):
# print(three_to_100())
a=three_to_100()
print("{}\t {}\t {}".format(*a))
Я построил пары (x, y) для первых 1000 чисел (третье число представлено цветом точки), и у меня есть:
старый ответ
Вы можете сгенерировать число от 0 до 100, затем еще одно от 0до (100 - первое число) и т. д.Последнее не будет случайным:
#! /usr/bin/env python3
import random
def three_to_100():
r1 = random.randint(0,100)
r2 = random.randint(0,100-r1)
r3 = 100 - r1 - r2
return r1, r2,r3
#main
for i in range(10):
print(three_to_100())
Вывод будет:
[romano:~/tmp] % ./randsum.py
(26, 7, 67)
(85, 13, 2)
(43, 41, 16)
(75, 22, 3)
(66, 19, 15)
(30, 16, 54)
(43, 30, 27)
(36, 2, 62)
(31, 2, 67)
(91, 0, 9)
Это график первых двух чисел - они кажутся довольно случайными, но, возможно, этоПравда, они кажутся немного переполненными по оси XY.