的IEEE.math_real.UNIFORM
實現是:
procedure UNIFORM(variable SEED1,SEED2:inout POSITIVE;variable X:out REAL) is
...
variable Z, K: INTEGER;
variable TSEED1 : INTEGER := INTEGER'(SEED1);
variable TSEED2 : INTEGER := INTEGER'(SEED2);
begin
...
K := TSEED1/53668;
TSEED1 := 40014 * (TSEED1 - K * 53668) - K * 12211;
if TSEED1 < 0 then
TSEED1 := TSEED1 + 2147483563;
end if;
K := TSEED2/52774;
TSEED2 := 40692 * (TSEED2 - K * 52774) - K * 3791;
if TSEED2 < 0 then
TSEED2 := TSEED2 + 2147483399;
end if;
Z := TSEED1 - TSEED2;
if Z < 1 then
Z := Z + 2147483562;
end if;
SEED1 := POSITIVE'(TSEED1);
SEED2 := POSITIVE'(TSEED2);
X := REAL(Z) * 4.656613e-10;
end UNIFORM;
通過這些描述關於實施:
a)用於該函數的語義由由Pierre L'Ecuyer在「上發表 算法描述ACM的通信 「卷。 31,沒有。 6,June 1988,pp.742-774。 該算法基於兩個 乘法線性同餘發生器的組合,用於32位 平臺。
b)所述第一呼叫均勻之前,種子值 (SEED1,seed2中)必須在範圍 [1,2147483562]和[1,2147483398]分別初始化爲數值。在每次調用UNIFORM後,修改種子值 。 c)該隨機數發生器對於32位的計算機是便攜式的,並且對於每個 種子值組,其具有〜2.30584 *(10 ** 18)的週期。
d)有關本算法譜檢驗信息,請參考 到L'Ecuyer製品。
L'eeyer的論文是"Efficient and portable combined random number generators",由user1155120在評論中給出。
所以這是一個Combined Linear Congruential Generator (CLCG)使用Wichmann的/希爾/施拉格/ Bratley等。當使用32位整數實現時,避免整數溢出(參見L'eeyer論文)。
看來,入選CLCG常數是衆所周知的,基於維基和其他參考資料,我可以通過快速搜索找到。當user1155120在註釋中通知時,CLCG的隨機屬性已在"A Comparison of Four Pseudo Random Number Generators Implemented in Ada"中進行了分析。
在此基礎上,它看來,VHDL隨機生成是非常穩固,所以我會認爲,你發現抖動/離羣只是隨機性的結果。
親愛downvoter,如果你留下的理由給予downvote評論,所以這個問題可以改進將是巨大的。 –
進行卡方檢驗可以發現抖動/異常值是否在合理範圍內。 –
是否可以在Gnuplot中做這樣的測試?我仍在等待我的統一分配完成...我目前的測試顯示重量中心不在2048. – Paebbels