Quiero generar 4 números enteros aleatorios en el rango [1,4] en una distribución uniforme. Por ejemplo, cada número aparece 3 veces para una secuencia de 12 elementos.

1
tzimhs panousis 9 may. 2016 a las 18:11

6 respuestas

La mejor respuesta

Puedes usar un generador:

from random import randint

def getNum1To4(runs):
    occurences = {n+1:0 for n in range(4)}
    for i in range(runs):
        options = [n for n in occurences if occurences[n] < runs / 4]
        choice = options[randint(0, len(options) - 1)]
        occurences[choice] += 1
        yield choice

Salidas:

>>> runs = 8
>>> gen = getNum1To4(8)
>>> for n in range(runs): print gen.next()
2
1
3
1
3
4
4
2
0
kmaork 9 may. 2016 a las 15:51

Prueba esto,

import random 
x = [i for i in range(1, 5)] * 3 
random.shuffle(x) # shuffle the sequence x in place

# Output
[4, 3, 1, 3, 2, 2, 3, 4, 4, 1, 2, 1]

Si los elementos son flotantes o dobles, la respuesta sería mucho más fácil usando numpy.random.uniform

import numpy as np
x = np.random.uniform(1, 5, 12)

# Output
array([ 4.18515267,  4.87403138,  3.43580119,  2.62828693,  3.77675348,
        4.15627119,  4.02190688,  3.56667674,  1.31115154,  1.74971624,
        3.20515834,  1.75240044])
0
SparkAndShine 9 may. 2016 a las 17:33

Puede usar listas para esta tarea para asegurarse de que su grupo de números disponibles no incluya duplicados. No estoy seguro de si necesita que aparezcan en bloques establecidos dentro de la lista de 12 o si desea que esté completamente al azar. Si es lo primero, elimine el último barajado.

from random import shuffle

choice_pool = [x for x in range(1, 5)]
random_output = []
number_of_runs = 4

for x in range(number_of_runs):
    shuffle(choice_pool)
    random_output += choice_pool

shuffle(random_output)
print random_output
0
roganjosh 9 may. 2016 a las 15:25

Este enfoque debería funcionar:

import random

foo = [i for i in range(1, 5)] * 4
print random.sample(foo, len(foo))

Salida: [2, 2, 3, 1, 4, 4, 3, 4, 1, 1, 3, 2, 1, 4, 3, 2]

0
user6275647 9 may. 2016 a las 16:18

Esto podría ayudarte

import random

def foo(number_of_runs, lower_limit, upper_limit):
    turns = number_of_runs // (upper_limit - lower_limit + 1)
    arr = list(range(lower_limit, upper_limit + 1)) * turns
    random.shuffle(arr)
    return arr

print(foo(12, 1, 4))
0
Vedang Mehta 9 may. 2016 a las 15:34

Para generar enteros aleatorios a partir de "Distribución aleatoria uniforme" en el rango dado [1,50] con un tamaño de 5, digamos,

from scipy.stats import randint as sp_randint

values = sp_randint.rvs(1, 50, size=5, random_state=0)

print(values)

Salida:

[94 97 50 53 53]

Tenga en cuenta que random_state=0 es necesario para escribir; de lo contrario, obtendrá resultados aleatorios en cada ejecución. Para obtener más información, consulte la documentación.

0
Dipen Bakraniya 24 dic. 2019 a las 10:20