2016-05-30 35 views
6

只是通過示例,並獲得有關創建2個隨機骰子並用按鈕滾動它們的練習。Elm - 初始化奇怪行爲的隨機數

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

所以我想我會創造骰子作爲一個模塊,取出滾動動作,只是把它創建初始化一個D6值。

所以我的代碼如下內容(應打開榆樹反應器直接)

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 ] 
      ] 

這裏的問題是,它總是產生相同的值。我以爲我的種子有問題,但是如果你改變了,但是如果你改變了

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

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

它的工作原理與預期完全一樣。所以它看起來像默認的發電機不工作的小值,似乎工作,作爲低至10.

奇怪的是,在這個例子中(我開始)http://guide.elm-lang.org/architecture/effects/random.html,它工作正常,1- 6,當它不在初始化。

所以我的問題是,我做錯了什麼,或者這只是榆樹的皺紋?我在init中的命令是否正確使用?

最後,我把這個放在了想要的效果上,這感覺很不可思議。

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

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

回答

3

這必須有東西做播種。您沒有爲種子指定任何值,因此生成器默認使用當前時間。

我認爲你試圖在幾秒內刷新你的頁面幾次,你沒有看到價值的變化。如果你等待更長時間(大約一分鐘),你會看到你的價值改變。

我看了一下Random的源代碼,我懷疑對於足夠接近的種子值,範圍[1,6]中生成的第一個值不會改變。我不確定這是否預期,可能是值得提出的問題GitHub

+0

是的,一分鐘的一個新值就是我所看到的行爲。建議我提出了一個問題。 –