Si necesita muestrear un número extremadamente grande, no se puede utilizar range
random.sample(range(10000000000000000000000000000000), 10)
porque arroja:
OverflowError: Python int too large to convert to C ssize_t
Además, si random.sample
no puede producir el número de elementos que desea debido a que el rango es demasiado pequeño
random.sample(range(2), 1000)
arroja:
ValueError: Sample larger than population
Esta función se resuelve ambos problemas:
import random
def random_sample(count, start, stop, step=1):
def gen_random():
while True:
yield random.randrange(start, stop, step)
def gen_n_unique(source, n):
seen = set()
seenadd = seen.add
for i in (i for i in source() if i not in seen and not seenadd(i)):
yield i
if len(seen) == n:
break
return [i for i in gen_n_unique(gen_random,
min(count, int(abs(stop - start)/abs(step))))]
uso con un número extremadamente grande:
print('\n'.join(map(str, random_sample(10, 2, 10000000000000000000000000000000))))
resultado de la muestra:
7822019936001013053229712669368
6289033704329783896566642145909
2473484300603494430244265004275
5842266362922067540967510912174
6775107889200427514968714189847
9674137095837778645652621150351
9969632214348349234653730196586
1397846105816635294077965449171
3911263633583030536971422042360
9864578596169364050929858013943
Uso donde el rango es menor que el número de artículos solicitados: resultado
print(', '.join(map(str, random_sample(100000, 0, 3))))
muestra:
2, 0, 1
También funciona con con rangos negativos y pasos:
print(', '.join(map(str, random_sample(10, 10, -10, -2))))
print(', '.join(map(str, random_sample(10, 5, -5, -2))))
de ejemplo resultados:
2, -8, 6, -2, -4, 0, 4, 10, -6, 8
-3, 1, 5, -1, 3
Si son únicos, entonces no son realmente aleatorios. –
@ IgnacioVazquez-Abrams Estoy tratando de implementar un método que mi profesor llamó "arranque", estamos haciendo una "investigación" en los motores de búsqueda. – iCodeLikeImDrunk
@ IgnacioVazquez-Abrams lo son si representan selecciones aleatorias sin reemplazo. Esta es una pregunta sobre un lenguaje de programación de uso general ... * lo usamos * para cosas –