2016-02-06 10 views
9

Ich möchte ein zufälliges int zwischen zwei Werten in Ulm generieren. Etwas wie folgt aus:elm generieren Zufallszahl

nb = random(0, 10)

ich die doc und mehrere Post gelesen haben. Die beste Antwort auf dieser Stackoverflow war post

gen = Random.int 0 10 
seed0 = Random.initialSeed 123456 
Random.generate gen seed0 

Aber das Problem ist, es ist immer denselben Wert zurückgeben und es ist nicht einmal ein int es so etwas wie das ist:

(7,Seed { state = State 645041272 40692, next = <function>, split = <function>, range = <function> }) 
: (Int, Random.Seed) 

So vom doc, ist es besser um die aktuelle Zeit für den Samen zu verwenden. Aber wie bekomme ich es? Muss ich dafür ein Signal verwenden? Gibt es keinen einfachen Weg, einen Zeitstempel zu bekommen?

Ich bin viel verwirrt, ich muss eine zufällige int für den Samen erzeugen, damit ich eine zufällige int generieren kann. Wenn nicht, wird der zufällige int nicht zufällig erzeugt. Ich denke ich habe etwas falsch verstanden ...

edit: Ich habe das auch gefunden post aber ich habe nicht alles verstanden.

+1

Mögliche Duplikate von [Was ist die richtige Art der Initialisierung einer Ulme-Anwendung] (http://stackoverflow.com/questions/28606248/what-is-the-correct-way-of-initializing-an-elm-application) –

Antwort

5

für 0,18 Aktualisiert

app = 
    Html.programWithFlags 
    { init = init 
    , update = update 
    , view = view 
    , subscriptions = always Sub.none 
    } 

init : {startTime : Float} -> Model 
init {startTime} = 
    { blankModel | randomSeed = Random.initialSeed <| round startTime } 

index.html

<script type="text/javascript"> 
    var yourPgm = Elm.fullscreen(Elm.Main, {startTime: Date.now()}); 
</script> 

Original-Antwort

Zufallszahlen-Komplex in reinen Programme sind, aber das ist, wie ich tu es mir n einer meiner games (mit Elm Architecture):

Main.elm

startTimeSeed : Seed 
startTimeSeed = Random.initialSeed <| round startTime 

app = 
    StartApp.start 
    { init = (init 8 8 startTimeSeed, Effects.none) 
    , update = update 
    , view = view 
    , inputs = [] 
    } 

port startTime : Float 

index.html

<script type="text/javascript"> 
    var yourPgm = Elm.fullscreen(Elm.Main, {startTime: Date.now()}); 
</script> 

Mit anderen Worten übergeben Sie den Zeitstempel durch den Anschluss, wenn Sie starte das Spiel

+0

Danke, das ist viel einfacher zu verstehen als ein Neuling im Vergleich zu anderen Ansätzen. – samspot

4

i Es wird immer derselbe Wert zurückgegeben

So funktionieren reine Zufallszahlengeneratoren. Du gibst einen Samen, und du bekommst einen anderen Samen zurück.

und es ist nicht einmal ein int es so etwas wie dieser [verrückt Code-Schnipsel] ist

Dies ist ein Paar von Werten. Der erste ist der Int, nach dem Sie suchen. Der zweite ist der neue Seed, um zufällige Werte zu generieren. Mach dir keine Sorgen darüber, was ein Samen eigentlich ist; es sollte undurchsichtig sein. Sie können das Paar mit herausholen, aber wenn Sie mehr Zufallszahlen wünschen, benötigen Sie den neuen Startwert.

Also aus dem doc, ist es besser, die aktuelle Zeit für den Samen zu verwenden.

Dieses Dokument ist falsch, falsch, falsch. Wie Sie herausgefunden haben, gibt es keine einfache Möglichkeit, den aktuellen Zeitstempel zu erhalten. Und wenn Sie es von JS weitergeben, wie Simon rät, verwenden Sie stattdessen Math.floor(Math.random()*0xFFFFFFFF). Dies gibt Ihnen einen Startwert, der besser über den möglichen Eingabebereich abgetastet wird.

Dies ist äußerst wichtig, da der Zufallszahlengenerator ähnliche Werte für ähnliche Seeds ausgeben wird. Zum Beispiel, wenn Sie einen Samen weniger als 53668 verwenden und einen Bool erzeugen, wird es True sein. Dies liegt an den Schwächen des verwendeten Algorithmus.

Die bessere Lösung: ->use this library < -. Es funktioniert genauso wie die Kernbibliothek, aber der Algorithmus ist viel besser, und die Dokumente zu Samen sind nicht eklatant falsch.