2015-05-25 13 views
12

में बेतरतीब संख्या मैं एक एजेंट है कि एक पासा के रूप में व्यवहार को लागू करने की कोशिश कर रहा हूँ। मैं क्या गलत कर रहा हूँ? क्या बीज काम नहीं कर रहा है क्योंकि :random.uniform कॉल एजेंट के अंदर है? या Stream से संबंधित कुछ हो सकता है।अमृत एजेंट

उत्तर

8

seed_generator फ़ंक्शन को आपके Agent का उपयोग करने की तुलना में एक अलग प्रक्रिया में बुलाया जाता है। वास्तव में यह कोड उस बिंदु पर भी मौजूद नहीं है जब यह कोड लोड हो जाता है।

defmodule Dice do 
    def start_link(opts \\ []) do 
    Agent.start_link(fn -> :random.seed(:erlang.now) end, name: __MODULE__) 
    end 

    def roll(n, val) do 
    Agent.get(__MODULE__, fn(_) -> 
     Stream.repeatedly(fn -> :random.uniform(val) end) 
     |> Enum.take(n) 
    end) 
    end 
end 
+0

काम करने के लिए लगता है, ऐसा किया: 'Agent.start_link जनरेटर बोने जब Agent शुरू करने का प्रयास (एफ एन ->: random.seed (: erlang.now); [] अंत में, नाम: __MODULE __)' एक खाली सूची को डिफ़ॉल्ट स्थिति के रूप में रखने के लिए। धन्यवाद। – Kernael

+0

आप 'रोल' फ़ंक्शन में किसी भी तरह से राज्य को अनदेखा कर रहे हैं, इसलिए मुझे नहीं लगता कि यह महत्वपूर्ण है। आपका वास्तविक राज्य प्रक्रिया शब्दकोश है जहां यादृच्छिक जनरेटर की स्थिति रखी जाती है। –

+2

erlang.now() के बजाय, फ़ंक्शन os.timestamp() भी अच्छा हो सकता है: http://www.erlang.org/doc/man/os.html#timestamp-0 क्योंकि erlang.now() ला सकता है कुछ समस्याएँ। – h4cc

संबंधित मुद्दे