0

我有一个包含 10 个元素的数组。如何以随机顺序输出这些而不重复。

4

4 回答 4

1

对于测试平台,OSVVM 的 RandomPkg 使这很容易。

library osvvm ; 
use osvvm.RandomPkg.all ;
...
RandProc : process
  variable RV : RandomPtype ;
  variable IndexVals : integer_vector(0 to 9) := (others => integer'low) ;
begin
  for i in IndexVals'range loop 
    --                         min  max   ExcludeList
    IndexVals(i) := RV.RandInt(  0,   9,   IndexVals) ;
  end loop ; 

如果连续随机生成的 10 个元素的排列需要与前一个不同,则问题会变得更加有趣。为此,我将使用覆盖模型。虽然,10 大约是我想要这样做的最大排列数,尽管有 n! 排列和覆盖模型将需要存储每个生成的排列。

于 2013-09-27T16:43:55.883 回答
1

对于测试平台,使用OSVVM随机库为您的数组生成随机索引。或者你可以随机播放它(使用Fischer-Yates 算法和随机库)。

如果需要合成,则将数组放入 RAM 块中,并生成随机地址(例如使用线性反馈移位寄存器)。

请注意,这些都不是正确随机的,只有伪随机。如果您正在尝试任何远程加密,它们不太可能是您想要的。

于 2013-09-27T14:21:00.353 回答
0

接近随机性的一个好方法是使用线性反馈移位寄存器。

http://en.wikipedia.org/wiki/Linear_feedback_shift_register

于 2013-09-27T12:57:58.247 回答
0

如果这仅用于模拟,您可以使用 ieee.math_real 中的统一过程来获取 0 到 1 之间的实数,并将其缩放到数组的索引范围。

于 2013-09-27T14:11:41.463 回答