webentwicklung-frage-antwort-db.com.de

Ganzzahl-Zufallszahlen aus dem Bereich (0: 10 ^ 12) generieren

Ich möchte 10000 Integer-Zufallszahlen zwischen 0 und 10 ^ 12 generieren ..__ Der Code würde normalerweise so aussehen:

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

Ich erhalte jedoch folgende Fehlermeldung:

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

Gibt es eine speichereffizientere Methode, die nicht 10 ^ 12 Ganzzahlen in einen Vektor schreiben muss, um nur eine Stichprobe der Größe 10000 zu erhalten? .__ Wenn nicht, gibt es eine Möglichkeit, die maximale Größe des Vektors zu erhöhen? Ich arbeite an einem 64-Bit-Betriebssystem mit 12 GB freiem RAM. 

17
user1775213

Das eigentliche Problem liegt darin, dass Sie die Sequenz von 0:10^12 nicht im Speicher ablegen können. Indem Sie einfach 0 und 10 ^ 12 als Grenzen einer gleichmäßigen Verteilung definieren, können Sie erhalten, was Sie suchen:

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

Dies wird sich aus der einheitlichen Verteilung ergeben (mit Ersatz, obwohl ich bezweifle, dass es darauf ankommt).

Was Sie jedoch nicht sehen können, ist, dass es sich hierbei tatsächlich um Floating-Zahlen handelt.

Sie können ceiling verwenden, um sie aufzurunden:

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

Der vollständige Code wäre also:

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

Weitere Nitpicking: 

Beachten Sie, dass dies technisch nicht zulässt, dass 0 vorhanden ist (da 0,0001 aufgerundet werden würde) 

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

Wie Carl Witthoft erwähnt, werden Zahlen, die nicht in die Größe einer Ganzzahl passen, offensichtlich keine Ganzzahlen sein. Sie können also nicht darauf zählen, dass diese Zahlen Ganzzahlen sind. Sie können sich immer noch darauf verlassen, dass sie zu TRUE ausgewertet werden, wenn sie mit derselben Gleitkommazahl ohne Dezimalzahlen verglichen werden.

27
PascalVKooten

Ich verstehe nicht, warum Sie nicht einfach tun können ...

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

Wenn xlength 1 hat, numeric (im Sinne von is.numeric) und x >= 1 ist, erfolgt die Probenahme über die Probe von 1:x.

N.B. Dies bedeutet nicht, dass sample den Vektor 1:x generieren muss. @James weist darauf hin, dass Sie zum Abtasten von 0:x auf sample(10^12+1,10,replace=TRUE)-1 anpassen

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

Zu Ihrer Information: as.integer führt eine Kürzung durch, keine Rundung.

Um zu testen, ob es funktioniert, können Sie versuchen, Zahlen in einem kleineren Intervall (d. H. Von 0 bis 6) zu generieren und das Histogramm des Ergebnisses zu visualisieren, um zu sehen, ob das Ergebnis eine gleichmäßige Verteilung ist, d. H.

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

Das Paket extraDistr bietet eine Reihe zusätzlicher Wahrscheinlichkeitsverteilungen, aus denen eine Stichprobe erstellt werden kann, einschließlich einer diskreten gleichförmigen Verteilung .

Zufallsstichproben mit der Funktion rdunif funktionieren wie andere stats-Zufallsstichfunktionen, die in R enthalten sind, wie runif, und vermeiden, wie in anderen Lösungen zu runden:

> 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