Генератор случайных чисел с условиями - Python - PullRequest
6 голосов
/ 29 мая 2020

Я новичок в Python и пытаюсь сгенерировать 5 чисел с 2 условиями:

  1. Должно быть 3 четных и 2 нечетных числа
  2. Из этих 5 чисел должны быть 3 быть низким (1,51) и 2 высоким (51,100). Какое число будет низким или большим, не представляет интереса.

Мне удалось решить первую часть:

import random
rand_even = random.sample(range(0, 100, 2), 3)
rand_odd = random.sample(range(1, 100, 2), 2)
rand_total = rand_even,rand_odd
print(rand_total)

Очевидно, это меня никуда не приведет. Для второй части Я думал, что могу использовать что-то вроде:

rand_low = random.sample(range(0, 51), 3)
rand_high = random.sample(range(51,100), 2)

Но, очевидно, это не способ, так как я получаю более 5 номеров.

Любая помощь будет принята. Спасибо

Ответы [ 4 ]

4 голосов
/ 29 мая 2020

Вопрос в том, как указали другие, допускаем ли мы корреляции между числами высокие / низкие и четные / нечетные. Следующий код не вводит эту корреляцию.

import random
n = 5                                                                           
odd = 2                                                                         
high = 2                                                                        

odd_indices = random.sample(range(n), odd)                                      
high_indices = random.sample(range(n), high)                                    
out = random.sample(range(26),n)                                                
for i in range(n):                                                              
    out[i] *= 2                                                                 
    if i in odd_indices:                                                        
        out[i] += 1                                                             
    if i in high_indices:                                                       
        out[i] += 50                                                             

Обратите внимание, что это включает число 100 как вариант вывода. Строго говоря, вы не включили его, поэтому можно ввести сдвиг при попадании 100:

    if out[i]==100:
        out[i] -= random.sample(range(1,25),1)[0]*2

Этот код не оптимизирован для производительности.

edit

Этот код будет иметь неправильность, поскольку в каждом возможном выходе 2k и 2k+1 никогда не встречаются одновременно для любого k.

1 голос
/ 29 мая 2020

Я попытался решить эту проблему логически и получилось довольно запутанно.

Эвристически, как насчет чего-то вроде этого:

def valid_list(l):
    evens, odds = 0, 0
    lows, highs = 0, 0
    for elem in l:
        if elem%2 == 0:
            evens += 1
        else:
            odds += 1
        if elem < 52:
            lows += 1
        else:
            highs += 1
    return evens <= 3 and odds <= 2 and lows <= 3 and highs <= 2

current_list = [random.randint(0, 100)]

while len(current_list) < 5:
    if not valid_list(current_list):
        current_list[-1] = random.randint(0, 100)
    else:
        current_list.append(random.randint(0, 100))

print(current_list)

У вас есть функция постоянно проверяет, находятся ли числа, которые у вас есть до сих пор, на отслеживании / действительны, а затем некоторое время l oop, который будет продолжать привязку указанной функции со случайными числами, пока не будет список из 5 чисел, которые пройдут valid_list.

Это в значительной степени воплощение случайности, хаха

0 голосов
/ 29 мая 2020
from random import seed
from random import random
import math
odd=0
even=0
below_50=0
above_50=0
numbers=[]
#Providing seed value to random()
seed(2)
while len(numbers)<5:
    num=math.floor(random()*100)
    #checking to maintain unique elements
    if num not in numbers:
        if num%2==0 and even<3:
            if num>50 and above_50<2:
                even+=1
                above_50+=1
                numbers.append(num)
            elif num<50 and below_50<3:
                even+=1
                below_50+=1
                numbers.append(num)
        elif num%2==1 and odd<2:
            if num>50 and above_50<2:
                odd+=1
                above_50+=1
                numbers.append(num)
            elif num<50 and below_50<3:
                odd+=1
                below_50+=1
                numbers.append(num)
0 голосов
/ 29 мая 2020

Если вам все равно, какие числа высокие / низкие или четные / нечетные, вы можете просто сказать, что высокие числа четные (поскольку вам нужно 3 младших и 3 четных числа).

Этот код просто дает 3 младших четных числа и 2 старших нечетных числа:

import random
rand_even_low = random.sample(range(0, 52, 2), 3)
rand_odd_high = random.sample(range(51, 1000, 2), 2)
rand_total = rand_even_low + rand_odd_high
print(rand_total)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...