web-dev-qa-db-fra.com

Générer un tableau aléatoire de flotteurs entre une plage

Je n'ai pas été capable de trouver une fonction pour générer un tableau de flottants aléatoires d'une longueur donnée entre une certaine plage.

J'ai regardé échantillonnage aléatoire mais aucune fonction ne semble faire ce dont j'ai besoin.

random.uniform se rapproche mais il ne retourne qu'un seul élément, pas un nombre spécifique.

C'est ce que je recherche:

ran_floats = some_function(low=0.5, high=13.3, size=50)

qui retournerait un tableau de 50 floats non uniques aléatoires (c'est-à-dire que les répétitions sont autorisées) uniformément répartis dans l'intervalle [0.5, 13.3].

Y a-t-il une telle fonction?

48
Gabriel

np.random.uniform correspond à votre cas d'utilisation: http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.uniform.html

sampl = np.random.uniform(low=0.5, high=13.3, size=(50,))
86
JoshAdel

Pourquoi ne pas utiliser une liste de compréhension?

ran_floats = [random.uniform(low,high) for _ in xrange(size)]
12
isedev

La boucle de lecture en liste prend du temps et la ralentit. Il est préférable d’utiliser des paramètres numpy (low, high, size, ..etc)

import numpy as np
import time
rang = 10000
tic = time.time()
for i in range(rang):
    sampl = np.random.uniform(low=0, high=2, size=(182))
print("it took: ", time.time() - tic)

tic = time.time()
for i in range(rang):
    ran_floats = [np.random.uniform(0,2) for _ in range(182)]
print("it took: ", time.time() - tic)

exemple de sortie:

('il a fallu:', 0.06406784057617188)

('il a fallu:', 1.7253198623657227)

3
Mohamed Ibrahim

Pourquoi ne pas combiner random.uniform avec une liste de compréhension?

>>> def random_floats(low, high, size):
...    return [random.uniform(low, high) for _ in xrange(size)]
... 
>>> random_floats(0.5, 2.8, 5)
[2.366910411506704, 1.878800401620107, 1.0145196974227986, 2.332600336488709, 1.945869474662082]
3
pkacprzak

Sinon, vous pouvez utiliser SciPy

from scipy import stats
stats.uniform(0.5, 13.3).rvs(50)

et pour l'enregistrement à échantillonner des entiers c'est

stats.randint(10, 20).rvs(50)
2
Stuart Hallows

Il y a peut-être déjà une fonction pour faire ce que vous cherchez, mais je ne le sais pas (encore?). En attendant, je suggérerais d'utiliser:

ran_floats = numpy.random.Rand(50) * (13.3-0.5) + 0.5

Cela produira un tableau de formes (50,) avec une distribution uniforme entre 0.5 et 13.3.

Vous pouvez également définir une fonction:

def random_uniform_range(shape=[1,],low=0,high=1):
    """
    Random uniform range

    Produces a random uniform distribution of specified shape, with arbitrary max and
    min values. Default shape is [1], and default range is [0,1].
    """
    return numpy.random.Rand(shape) * (high - min) + min

EDIT : Hmm, oui, alors je l'ai raté, il y a numpy.random.uniform () avec le même appel que vous voulez! Essayez import numpy; help(numpy.random.uniform) pour plus d'informations.

2
PhilMacKay

C'est le moyen le plus simple

np.random.uniform(start,stop,(rows,columns))
1
George Gee