Убедитесь, что сумма двух случайно сгенерированных чисел равна сумме двух других случайно сгенерированных чисел - PullRequest
1 голос
/ 04 марта 2020

Я пишу программу, которая вычисляет вращающие силы (моменты) на равномерном стержне (где центр масс находится посередине). Мне нужно разделить длину стержня на четыре значения, которые не обязательно должны быть равны; однако сумма первых двух значений должна равняться сумме двух последних значений. Общая длина стержня должна генерироваться случайным образом - так как мне это сделать?

Вот как я случайным образом генерирую числа:

random_value_one = random.uniform(1, 5)
random_value_two = random.uniform(1, 5)
random_value_three = random.uniform(1, 5)
random_value_four = random.uniform(1, 5)
total_length_of_rod = random_value_one + random_value_two + random_value_three + random_value_four
centre_of_mass = total_length_of_rod / 2

Ответы [ 5 ]

5 голосов
/ 04 марта 2020

Короче говоря, ваше четвертое значение не случайно. Таким образом, вы можете сгенерировать первые два и вычислить сумму. Затем сгенерируйте третий в диапазоне этой суммы. Четвертое значение - это разница. Вы также можете работать с общей длиной или половиной длины, которую вы разбили случайным образом.

import random

# option1: random 1st and 2nd, 3rd splits total, fourth is difference
rv1 = random.uniform(1, 5)
rv2 = random.uniform(1, 5)
sumOfFirst2 = rv1 + rv2
rv3 = random.uniform(1, sumOfFirst2-1)
rv4 = sumOfFirst2 - rv3

print("Option1:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 2: random total length, split each half randomly
totalLength = random.uniform(4,20)
sumOfFirst2 = totalLength/2
rv1         = random.uniform(1,sumOfFirst2-1)
rv2         = sumOfFirst2 - rv1
rv3         = random.uniform(1,sumOfFirst2-1)
rv4         = sumOfFirst2 - rv3

print("Option2:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 3: random half length, split each side
sumOfFirst2 = random.uniform(2,10)
rv1         = random.uniform(1,sumOfFirst2-1)
rv2         = sumOfFirst2 - rv1
rv3         = random.uniform(1,sumOfFirst2-1)
rv4         = sumOfFirst2 - rv3

print("Option3:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 4: random extermities, random sum of center parts then split center
rv1         = random.uniform(1,5)
rv4         = random.uniform(1,5)
center      = random.uniform(2,10)
totalLength = center+rv1+rv4
rv2         = totalLength/2 - rv1 
rv3         = totalLength/2 - rv4

print("Option4:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

output:

Option1:
3.8733926704150394 1.2002268887772458 5.073619559192285
3.840231922558826 1.2333876366334593 5.073619559192285

Option2:
3.547962226731686 1.2866434919683414 4.834605718700027
1.52708327731985 3.3075224413801774 4.834605718700027

Option3:
5.271438412416368 3.9102475112312245 9.181685923647592
2.116625606537367 7.065060317110225 9.181685923647592

Option4:
2.0745608124206196 4.236051851683254 6.310612664103874
4.163042898863589 2.1475697652402848 6.310612664103873 

Если вас интересует распределение, вы можете выбрать метод, который подходит Ваши требования лучше всего.

1 голос
/ 04 марта 2020

Это должно привести вас туда, где вам нужно:

random_sum = random.uniform(1, 5)
random_value_one = random.uniform(1, random_sum)
random_value_two = random_sum - random_value_one

random_value_three = random.uniform(1, random_sum)
random_value_four = random_sum - random_value_three 
1 голос
/ 04 марта 2020

Один из способов - получить все пары чисел с правильной суммой, а затем выбрать один случайным образом.

import random
r1 = random.randrange(1, 6)
r2 = random.randrange(1, 6)
pairs = [x for x in [(i, j) for i in range(1, 6) for j in range(1, 6)] if sum(x) == r1 + r2]
r3, r4 = random.choice(pairs)
total_length_of_rod = r1 + r2 + r3 + r4
centre_of_mass = total_length_of_rod / 2
1 голос
/ 04 марта 2020

А как насчет этой логики c? Сгенерируйте первые два случайных числа и сложите их. Затем сгенерируйте третье случайное число и проверьте, меньше ли оно, чем сложение первых двух. если это так, последнее случайное число будет [(сложение первых двух) - (третье случайное число)]. Если это не так, сгенерируйте третье случайное число еще раз. Это гарантирует, что можно добавить к той же длине (если бы третье число было больше, это было бы невозможно). 4-е число не генерируется случайным образом, но оно является случайным в том смысле, что третье число является случайным, и оно должно равняться сумме первых двух, чтобы последнее число не имело выбора.

Таким образом вы избегаете вложенных циклов и повышаете эффективность:)

0 голосов
/ 04 марта 2020

Поместите все это в функцию, которую вы можете вызвать, затем в конце получите if l oop. Проверьте, если ((rod1 + rod2) == (rod3 + rod4)), а если нет, то вызовите функцию, чтобы перезапустить ее. Кроме того (или если python не позволяет logi c, как эта работа), вам может потребоваться объявить новые переменные: rod1 + rod2 и rod3 + rod4, а затем сравнить их значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...