Entwerfen Sie einen Zufallszahlengenerator, bei dem die i-te Zahl für alle 0 <i <14 eine Wahrscheinlichkeit von i% hat. 0 sollte eine Wahrscheinlichkeit von genau 9% haben. Der Startwert für den Generator sollte die Systemzeit sein. Sie können keine vordefinierte Funktion zur Erzeugung von Zufallszahlen verwenden.
Grundsätzlich hat 1 eine Eintrittswahrscheinlichkeit von 1%, 2 eine Eintrittswahrscheinlichkeit von 2% usw. Bis zu 13 haben eine Eintrittswahrscheinlichkeit von 13%. Dies ist Code-Golf, also gewinnt der kürzeste Code.
code-golf
math
random
probability-theory
Ghosts_in_the_code
quelle
quelle
<
aus der Ungleichung und>
aus dem Anführungszeichenblock bildeten ein HTML-Tag.Antworten:
CJam, 14 Bytes
Testen Sie es hier.
Erläuterung
quelle
mR
?Python 2, 54
Der Ausdruck
f(t) = ((8*t+1)**.5+1)//2
wandelt eine gleichmäßige Verteilung in eine dreieckige Ganzzahlverteilung um, indem die Intervalle abgebildet werdenWir konvertieren dabei die Millisekunden-Ziffern der Zeit in einen einheitlichen Gleitkommawert von 0 bis 100
time.time()*1e4%100
. Tatsächlich%800
ersetzen wir im Konvertierungsschritt das Multiplizieren durch 8. Am Ende werden 14er durch Handeln in Nullen umgewandelt%14
.quelle
Pyth - 14 Bytes
Erzeugt ein Array mit der angegebenen Verteilung und wählt dann ein zufälliges aus.
Probieren Sie es hier online aus .
quelle
Dyalog APL , 20 Bytes
⍳13
Ganzzahlen 1 bis 13(/⍨
…)
replizieren von selbst, z. B./⍨3
ist3 3 3
und/⍨2 3
ist2 2 3 3 3
n
↓
… n Elemente löschen (leere Liste, wenn n > Länge der Liste)⎕TS
Systemzeitstempel zB 2015 11 1 13 28 56 834⊃⌽
letztes Element, dh aktuelle Millisekunde 0–999⌊.1×
multiplizieren mit 0.1 und abrunden des⊃
ersten Elements ergibt 0, wenn die Daten leer sindquelle
Verarbeitung von 3, 65
5574BytesHolen Sie sich eine Zufallszahl von 0 bis 99 (einschließlich). Wenn die Zahl 0-8 ist, drucken Sie 0, wenn es 9 ist, drucken Sie 1, wenn 10-11 drucken Sie 2, wenn 12-14 drucken Sie 3 usw.
Niemand hat es bemerkt, aber das Problem mit dem alten Code ist, dass millis () die Zeit zurückgibt, die die Anwendung ausgeführt wurde, was bei nachfolgenden Programmläufen sehr ähnliche Zahlen ergeben würde. Zumindest haben wir jetzt Nano-Präzision!
quelle
PHP, 50 Bytes
microtime
Gibt die Zeit als Zeichenfolge wie "0.04993000 1446409253" zurück. Wenn ich dies mit 100 multipliziere, erzwingt PHP die Zeichenfolge in 0.04993000, Ergebnis 4.993000. So$t
wird mit einer „Zufallszahl“ initialisiert in[0,100)
$t
bis es 0 erreichtquelle
;echo
statt?><?=
für die gleiche Byteanzahl schreiben . Aber schön gemacht!Python3, 86 Bytes
einfach:
quelle
J - 28 char
Dieser war dumm.
6!:0''
ist die aktuelleY M D h m s
Zeit als Liste mit 6 Elementen, in der Millisekunden als Brüche in Sekunden dargestellt werden. Um sie zu erreichen, müssen wir nur die Sekunden ({:
) mit multiplizieren1e3
. In der Zwischenzeit gibt#~i.14
es eine Liste mit null Nullen, einer 1, zwei 2s usw. bis zu dreizehn 13s, und wir füllen diese mit 100 Elementen auf100{.
.J hat keine zyklische Indizierung, daher ist es möglicherweise verlockend, das Millisekunden-Modulo 100 zu verwenden, bevor die große Liste indiziert wird. Wir können jedoch zwei Zeichen speichern, indem wir
$
stattdessen die Liste mit 100 Elementen zyklisch auf die Millisekunden erweitern, die wir erhalten (zwischen 0 und 60999 ), und dann den letzten Eintrag vornehmen .Nicht dass eine 60000-Elementliste eine Menge Speicherplatz oder irgendetwas anderes ist, es fühlt sich einfach wie ein Overkill an: P.
quelle
JavaScript (ES6) 116
Dies ist eine Adaption eines einfachen gesetzten RNG, das ich anstelle des Standard-RNG von Javascript verwendet habe, das nicht ausgesät werden kann (und daher nicht wiederholbar ist).
quelle
TI-BASIC, 18 Bytes
100fPart(sub(getTime
erhält den zufälligen Rest zwischen 0 und 99. Die (n-1) -te Dreieckszahl ist gleich(N^2+N)/2
, also ist die Umkehrung gleich√(2y+1)-.5
. Stellen Sie dies auf den Boden, nachdem Sie es um 9 nach unten eingestellt haben, und wir haben das ErgebnisDas einzige Problem ist, dass wir für Reste unter 8 eine imaginäre Quadratwurzel erhalten. Wir nehmen also den Realteil, um stattdessen die Programmausgabe 0 zu haben.
quelle
Perl 5, 51 Bytes
50 Bytes + 1 für
-E
anstelle von-e
:quelle