web-dev-qa-db-fra.com

Générer des nombres aléatoires entiers à partir de la plage (0: 10 ^ 12)

Je veux générer 10000 nombres aléatoires entiers compris entre 0 et 10 ^ 12 . Habituellement, le code ressemblerait à ceci:

x <- sample(0:1000000000000,10000,replace=T)

Mais je reçois le message d'erreur suivant:

Error in 0:1000000000000 : result would be too long a vector

Existe-t-il une méthode moins gourmande en mémoire qui ne nécessite pas de mettre 10 ^ 12 entiers dans un vecteur pour obtenir un échantillon de taille 10 000? Si non, existe-t-il un moyen d'augmenter la taille maximale du vecteur? Je travaille sur un système d'exploitation 64 bits avec 12 Go de RAM libre. 

17
user1775213

Le vrai problème réside dans le fait que vous ne pouvez pas stocker la séquence de 0:10^12 en mémoire. En définissant simplement 0 et 10 ^ 12 comme limites d'une distribution uniforme, vous pouvez obtenir ce que vous cherchez:

runif(10000, 0, 10^12)
[1] 136086417828 280099797063 747063538991 250189170474 589044594904
[6]  65385828028 361086657969 186271687970 338900779840 649082854623  ........

Cela va tirer de la distribution uniforme (avec remplacement, bien que je doute que ça compte).

Cependant, ce que vous ne pouvez pas voir, c'est que ce sont en fait des nombres flottants.

Vous pouvez utiliser ceiling pour les arrondir:

samp = runif(1, 0, 10^12)
samp
[1] 19199806033
samp == 19199806033
[1] FALSE
ceiling(samp) == 19199806033
[1] TRUE

Donc le code complet serait:

ceiling(runif(10000, 0, 10^12))

Nitpicking supplémentaire: 

Notez que techniquement, cela ne permettra pas à 0 d’être là (puisque 0.0001 serait arrondi), vous pouvez donc tirer simplement de 

ceiling(runif(10000, -1, 10^12))

Comme Carl Witthoft mentionne, les nombres qui ne rentrent pas dans la taille d'un entier ne seront évidemment pas des entiers, vous ne pouvez donc pas compter sur ces nombres pour être des entiers. Vous pouvez toujours compter sur eux pour évaluer TRUE par rapport au même nombre flottant sans décimales.

27
PascalVKooten

Je ne comprends pas pourquoi vous ne pouvez pas simplement faire ...

sample(10^12,10,replace=TRUE)
#[1] 827013669653 233988208530 653034892160 564841068001 801391072663 683607493313
#[7] 254556497302 510154570389  51922126428 537709431414

Si x a length 1, est numeric (au sens de is.numeric) et x >= 1, l'échantillonnage via échantillon a lieu à partir de 1:x.

N.B. Cela ne signifie pas que sample doit générer le vecteur 1:x !! @James souligne que pour l'échantillonnage de 0:x, vous devrez vous adapter à sample(10^12+1,10,replace=TRUE)-1

23
Simon O'Hanlon
floor(runif(10000,min=0,max=(10^12)))
1
as.integer(runif(10000, min = 0, max = (1 + 10^12)))

FYI: as.integer effectue une troncature, pas un arrondi.

Pour vérifier si cela fonctionne, vous pouvez essayer de générer des nombres dans un intervalle plus petit (c'est-à-dire de 0 à 6) et visualiser l'histogramme du résultat pour voir si le résultat est une distribution uniforme, c'est-à-dire.

test <- as.integer(runif(10000, min = 0, max = (6 + 1)))
hist(test)
0
Marco Demaio

Le paquetage extraDistr fournit une gamme de distributions de probabilité supplémentaires à échantillonner, y compris une distribution uniforme discrète .

L'échantillonnage aléatoire avec la fonction rdunif fonctionne comme les autres fonctions d'échantillonnage aléatoires stats incluses dans R comme runif et évite de devoir arrondir comme dans d'autres solutions:

> library("extraDistr")
> rdunif(n = 10000, min = 0, max = 10^12)
[1] 699559531175 881392957410 315869810758 941600866616
[5] 906084092567 681591022527 514061764115 122652820777
[9] 583204373950 517842726316 741211620393 422150962055 ...
0
Umaomamaomao