VHDL的随机数有多好?

我正在使用来自IEEE.math_real的VHDL随机数,但这些生成的数字有多好?

….让我们说与C的兰德(…)相比

有统计测试吗?

这是高斯分布的直方图.参数:

>随机源:由math_real.Uniform(…)生成的2个均匀分布的REAL值
> Box-Muller转型
>使用REAL计算
>输出范围:0..4095 INTEGER
> 102.400次迭代

经典直方图视图:
《VHDL的随机数有多好?》

作为点云:
《VHDL的随机数有多好?》

这是均匀分布的直方图.参数:

>随机源:由math_real.Uniform(…)生成的均匀分布的REAL值
>使用REAL计算
>输出范围:0..4095 INTEGER
> 102.400次迭代

经典直方图视图:
《VHDL的随机数有多好?》

作为点云:
《VHDL的随机数有多好?》

gnuplot拟合f(x)= m * x b的结果:

m = -0.0000343906
b = 25.0704

在我看来,两个直方图都有很高的抖动.

最佳答案 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) The semantics for this function are described by the
algorithm published by Pierre L’Ecuyer in “Communications
of the ACM,” vol. 31, no. 6, June 1988, pp. 742-774.
The algorithm is based on the combination of two
multiplicative linear congruential generators for 32-bit
platforms.

b) Before the first call to UNIFORM, the seed values
(SEED1, SEED2) have to be initialized to values in the range
[1, 2147483562] and [1, 2147483398] respectively. The
seed values are modified after each call to UNIFORM.

c) This random number generator is portable for 32-bit
computers, and it has a period of ~2.30584*(10**18) for each
set of seed values.

d) For information on spectral tests for the algorithm, refer
to the L’Ecuyer article.

L’ecuyer论文是“Efficient and portable combined random number generators”,由用户1155120在评论中给出.

所以它是Combined Linear Congruential Generator (CLCG)使用Wichmann / Hill / Schrage / Bratley等. al.的方法(参见L’ecuyer论文),以避免使用32位整数实现时的整数溢出.

看来,为CLCG选择的常数是众所周知的,基于Wiki和我通过快速搜索找到的其他参考文献.当用户1155120在评论中通知时,已经在“A Comparison of Four Pseudo Random Number Generators Implemented in Ada”中分析了CLCG的随机属性.

基于此,似乎VHDL随机发生器非常可靠,所以我认为你发现的抖动/异常值只是随机性的结果.

点赞