2016-02-06 34 views
9

Tôi muốn tạo một int ngẫu nhiên giữa hai giá trị trong elm. Something như thế này:elm tạo số ngẫu nhiên

nb = random(0, 10)

Tôi đã đọc doc và nhiều đường bưu điện. Câu trả lời tốt nhất là từ stackoverflow post

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

này Nhưng vấn đề là nó luôn luôn trả về giá trị như nhau và nó thậm chí không một int nó là cái gì như thế này:

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

Vì vậy, từ doc, nó tốt hơn để sử dụng thời gian hiện tại cho hạt giống. Nhưng làm thế nào để có được nó? Tôi có phải sử dụng tín hiệu cho điều này không? sao không có cách dễ dàng để có dấu thời gian?

Tôi rất bối rối, tôi cần tạo một int ngẫu nhiên cho hạt giống để tôi có thể tạo một int ngẫu nhiên. Nếu không phải là int ngẫu nhiên tạo ra không phải là ngẫu nhiên. Tôi nghĩ rằng tôi đã hiểu nhầm điều gì đó ...

chỉnh sửa: Tôi cũng đã tìm thấy điều này post nhưng tôi không hiểu mọi thứ.

+1

Bản sao có thể có của [Cách chính xác để khởi tạo ứng dụng elm] là gì (http://stackoverflow.com/questions/28606248/what-is-the-correct-way-of-initializing-an-elm-application) –

Trả lời

5

Cập nhật cho 0,18

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> 

gốc trả lời

số ngẫu nhiên rất phức tạp trong các chương trình thuần túy, nhưng đây là cách tôi làm điều đó tôi n một trong games (sử dụng Elm Kiến trúc) của tôi:

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> 

Nói cách khác vượt qua các tem thời gian qua cổng khi bạn bắt đầu trò chơi

+0

Cảm ơn bạn, điều này dễ hiểu hơn khi là một newbie so với các cách tiếp cận khác. – samspot

4

i t luôn trả về [ing] cùng một giá trị

Đây là cách trình tạo số ngẫu nhiên tinh khiết hoạt động. Bạn vượt qua trong Seed, và bạn lấy lại Seed khác.

và nó thậm chí không một int nó là cái gì như thế này [Đoạn mã điên]

Đây là một cặp giá trị. Đầu tiên là int bạn đang tìm kiếm. Thứ hai là hạt giống mới để tạo ra các giá trị ngẫu nhiên. Đừng lo lắng về những gì một hạt giống thực sự là; nó sẽ mờ đục. Bạn có thể nhận được int trong cặp bằng cách sử dụng fst, nhưng nếu bạn muốn số ngẫu nhiên hơn, bạn sẽ cần hạt giống mới.

Vì vậy, từ tài liệu, tốt hơn nên sử dụng thời gian hiện tại cho hạt giống.

Tài liệu này sai, sai, sai. Như bạn đã khám phá, không có cách nào dễ dàng để có được dấu thời gian hiện tại. Và nếu bạn chuyển nó từ JS, như Simon khuyên, chỉ cần sử dụng Math.floor(Math.random()*0xFFFFFFFF) để thay thế. Điều này cho bạn một hạt giống được lấy mẫu tốt hơn so với không gian đầu vào có thể.

Điều này cực kỳ quan trọng vì trình tạo số ngẫu nhiên sẽ xuất ra các giá trị tương tự cho các hạt giống tương tự. Ví dụ: nếu bạn sử dụng bất kỳ hạt giống nào nhỏ hơn 53668 và tạo một bool, nó sẽ là True. Điều này là do các điểm yếu trong thuật toán được sử dụng.

Các giải pháp tốt hơn: ->use this library < -. Nó hoạt động giống như thư viện cốt lõi, nhưng thuật toán thì tốt hơn nhiều, và các tài liệu về hạt giống không phải là sai.