2016-05-30 46 views
6

Basta lavorare con i campioni e ottenere l'esercizio sulla creazione di 2 dadi casuali e ruotarli con un pulsante.Elm - Numero casuale su comportamento strano dell'iniziale

http://guide.elm-lang.org/architecture/effects/random.html

Così ho pensato di creare i dadi come modulo, rimuovere l'azione rotolo, e solo si crea un valore D6 su init.

Quindi il mio codice è ora la seguente (dovrebbe aprirsi diretta a Elm-reattore)

module Components.DiceRoller exposing (Model, Msg, init, update, view) 

import Html exposing (..) 
import Html.App as Html 
import Html.Attributes exposing (..) 
import Html.Events exposing (..) 
import Random 
import String exposing (..) 

main = 
    Html.program 
     { init = init 
     , view = view 
     , update = update 
     , subscriptions = subscriptions 
     } 



-- MODEL 


type alias Model = 
    { dieFace : Int 
    } 


init : (Model, Cmd Msg) 
init = 
    (Model 0, (Random.generate NewFace (Random.int 1 6))) 



-- UPDATE 


type Msg 
    = NewFace Int 


update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
     NewFace newFace -> 
      (Model newFace, Cmd.none) 



-- SUBSCRIPTIONS 


subscriptions : Model -> Sub Msg 
subscriptions model = 
    Sub.none 



-- VIEW 


dieFaceImage : Int -> String 
dieFaceImage dieFace = 
    concat [ "/src/img/40px-Dice-", (toString dieFace), ".svg.png" ] 


view : Model -> Html Msg 
view model = 
    let 
     imagePath = 
      dieFaceImage model.dieFace 
    in 
     div [] 
      [ img [ src imagePath ] [] 
      , span [] [ text imagePath ] 
      ] 

Il problema di questo è che è sempre producendo lo stesso valore. Ho pensato di avere un problema con il seme per cominciare, ma se si modifica

init = 
    (Model 0, (Random.generate NewFace (Random.int 1 6))) 

init = 
    (Model 0, (Random.generate NewFace (Random.int 1 100))) 

funziona esattamente come previsto. Quindi sembra che il generatore predefinito non funzioni con valori piccoli, sembra funzionare come in basso come 10.

La cosa strana è questa, in questo esempio (che ho iniziato con) http://guide.elm-lang.org/architecture/effects/random.html, funziona bene con 1- 6 quando non è in init.

Quindi la mia domanda è, sto facendo qualcosa di sbagliato, o questa è solo una ruga in olmo? Il mio uso del comando in init ok?

Alla fine, inserisco questo effetto per ottenere l'effetto desiderato, il che sembra tremante.

init = 
    (Model 0, (Random.generate NewFace (Random.int 10 70))) 

con

NewFace newFace -> 
     (Model (newFace // 10), Cmd.none) 

risposta

3

Questo deve avere qualcosa a che fare con la semina. Non stai specificando alcun valore per seed in modo che il generatore sia impostato in modo predefinito per utilizzare l'ora corrente.

Penso che si sia tentato di aggiornare la pagina per alcune volte in pochi secondi e non si è visto il cambio di valore. Se aspetti più a lungo (circa un minuto) vedrai il tuo valore cambiare.

Ho dato un'occhiata al codice sorgente di Random e ho il sospetto che per i valori di seme abbastanza vicini il primo valore generato nell'intervallo [1,6] non cambi. Non sono sicuro che sia previsto o meno, probabilmente vale la pena sollevare un problema su GitHub

+0

Sì, un nuovo valore al minuto era esattamente il comportamento che stavo vedendo. Ho sollevato un problema come suggerito. –