隨機發生器gen
不應該是本地的功能。目前,您正在重新創建每個generate_random_number
調用並初始化它,因此您始終得到相同的結果並不奇怪。
如果您製作gen
- 例如 - 一個全局變量,初始化一次,然後每次使用它,您將得到一個新的隨機數。 (是的,全局變量是不好的,但見下面)
不幸的是,這對function generate_random_number (n: in Positive)
的語義沒有特別好的發揮,它可以每次不同地限制隨機數的範圍。最簡單的解決方法是使gen
返回任何有效整數,並使用模塊化算法爲每個呼叫返回正確範圍內的數字。這將起作用,但您應該意識到它可能會引入加密弱點,超出我的分析技能。
如果是這種情況,您將需要不同的方法,例如爲您需要的每個範圍創建一個不同的隨機生成器;注意以不同方式播種(重置)它們,否則可能再次存在加密弱點,例如不同生成器之間的相關性。
現在,全球變量對於任何語言的所有常見原因而言都是糟糕的結構。所以更好的方法是通過將其包裝在一個包中來使其成爲一種資源。
package RandGen is
function generate_random_number (n: in Positive) return Positive;
end RandGen;
而這就是所有客戶需要看到的。
with Ada.Numerics.discrete_Random;
package body RandGen is
subtype Rand_Range is Positive;
package Rand_Int is new Ada.Numerics.Discrete_Random(Rand_Range);
gen : Rand_Int.Generator;
function generate_random_number (n: in Positive) return Integer is
begin
return Rand_Int.Random(gen) mod n; -- or mod n+1 to include the end value
end generate_random_number;
-- package initialisation part
begin
Rand_Int.Reset(gen);
end RandGen;
編輯::拒絕外的範圍內的值的雅各的建議是更好,但效率低,如果n大於發電機範圍小得多的封裝如下實現的。一種解決方案可能是創建多個生成器,並讓generate_random_number
函數選擇一個覆蓋0..N的函數,浪費最小。
看到這個問題:http://stackoverflow.com/questions/21245051/ada-seeding-random。我對Ada並不熟悉,但看起來好像每次都使用相同的數字重新編號,即使粗略查看您的代碼並不能說明它如何。 – 2014-11-06 18:11:53
如果您每次都返回相同的號碼,那告訴我您每次都發送相同的種子,而不是按順序接收下一個。 – 2014-11-06 18:12:10
這是種子所有的時間,因爲當我稱這個函數兩次延遲幾秒鐘,它返回另一個隨機。有一條線應該重置發生器,但看起來不起作用。 – 2014-11-06 18:18:14