Générer entier aléatoire de numéros de plage (0:10^12)
Je veux générer 10000 entiers nombres aléatoires entre 0 et 10^12.
Généralement, le code ressemblera à ceci:
x <- sample(0:1000000000000,10000,replace=T)
Mais j'obtiens un message d'erreur suivantes:
Error in 0:1000000000000 : result would be too long a vector
Est-il plus efficace en terme de mémoire méthode qui n'est pas 10^12 entiers dans un vecteur juste pour obtenir un échantillon de taille 10000?
Si non, est-il un moyen d'augmenter la taille maximale du vecteur? Je suis en train de travailler sur un OS 64 bits avec 12 go de RAM libre.
Ont-ils besoin d'être unique?
Avez-vous estimer les besoins en mémoire d'un vecteur de 10^12 éléments? 12 Go serait pas assez.
Pourquoi voulez-vous un tel éventail? Essentiellement, ce que vous me demandez est aléatoire uniforme des échantillons avec 12 place de la précision, et je ne peux pas comprendre la nécessité de ce genre de détails.
Avez-vous estimer les besoins en mémoire d'un vecteur de 10^12 éléments? 12 Go serait pas assez.
Pourquoi voulez-vous un tel éventail? Essentiellement, ce que vous me demandez est aléatoire uniforme des échantillons avec 12 place de la précision, et je ne peux pas comprendre la nécessité de ce genre de détails.
OriginalL'auteur user1775213 | 2013-11-07
Vous devez vous connecter pour publier un commentaire.
Le vrai problème réside dans le fait que vous ne pouvez pas stocker la séquence de
0:10^12
dans la mémoire. Simplement en définissant 0 et 10^12 comme les limites d'une distribution uniforme, vous pourriez obtenir ce que vous cherchez:Cela attirera à partir de la distribution uniforme (avec remplacement, bien que je doute que les questions).
Cependant, ce que vous ne voyez pas, c'est que ce sont en fait des nombres flottants.
Vous pouvez utiliser
ceiling
à la ronde:Donc le code complet serait:
Plus tatillonne:
Noter que cette technique ne permettra pas de 0 à être là (depuis 0.0001 serait arrondi à la hausse), alors vous pouvez simplement tirer de
Comme Carl Witthoft mentionne, des chiffres qui ne correspondent pas à la taille d'un entier ne sera pas des entiers évidemment, si vous ne pouvez pas compter sur ces nombres entiers. Vous pouvez toujours compter sur eux pour évaluer à
TRUE
par rapport à la même nombre flottant sans décimales.2^31 < 10^12
. Ils sont encore de flotteurs, et vous pouvez ainsi exécuter dans l'erreur d'arrondi si vous ne faites pas attention.N'est-ce pas abordé en utilisant
ceiling
?is.integer(ceiling(10^11)) [1] FALSE
. Unfloat
sans partie décimale n'est PAS uninteger
la mesure où l'ordinateur est concerné.Je trouve en effet magnifiques que
is.integer(ceiling(runif(1, -1, 10^12)))
évalue àFALSE
. Je suppose qu'il n'a pas d'importance pour l'OP, mais ce pourrait être un sujet de préoccupation pour vous.as.integer
introduitNA
.Vous pouvez toujours représenter des valeurs intégrales en utilisant exactement les doubles jusqu'à 2^53, qui est juste timide de 10^16.
OriginalL'auteur PascalVKooten
Je ne comprends pas pourquoi vous ne pouvez pas simplement faire...
N. B. Cela ne signifie pas que
sample
a générer le vecteur1:x
!! @James souligne que pour l'échantillonnage de0:x
vous aurez besoin de s'adapter àsample(10^12+1,10,replace=TRUE)-1
Si 0 est actuellement pas inclus.
sample(10^12+1,10,replace=TRUE)-1
Bien sûr, mais il se sent encore plus d'un hack.
Complètement n'a pas d'importance si vous devez inclure le zéro du vecteur de possibilités ou pas, parce que la probabilité de choisir, même si c'est il y a seulement 10^(-12)!
OriginalL'auteur Simon O'Hanlon
OriginalL'auteur Nicholas Hamilton
FYI:
as.integer
effectue une troncature, pas de un arrondissement.Afin de tester si cela fonctionne, vous pouvez essayer de générer des nombres dans un petit intervalle (c'est à dire de 0 à 6) et de visualiser l'histogramme de la suite pour voir si le résultat est une distribution uniforme, c'est à dire
m <- as.integer(runif(10000, min = 0, max = (1 + 10^12)))
MAIS trouvéNAs introduced by coercion to integer range
Donc à utiliser avec prudence. Oùm <- ceiling(runif(10000, -1, 10^12))
ne produisent pas de NAs.OriginalL'auteur Marco Demaio
Le paquet
extraDistr
fournit un éventail de distributions de probabilité de l'échantillon, y compris une uniforme discrète de la distribution.Échantillonnage aléatoire avec la fonction
rdunif
fonctionne comme les autresstats
échantillonnage aléatoire fonctions incluses avec R commerunif
, et évite de devoir ronde comme dans d'autres solutions:OriginalL'auteur Umaomamaomao