私は10個の要素の配列を持っています。これらを繰り返さずにランダムな順序で出力するにはどうすればよいですか。
4 に答える
テストベンチの場合、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 は順列の最大数です。順列とカバレッジ モデルは、生成された順列ごとにストレージを必要とします。
テストベンチの場合は、OSVVMランダム ライブラリを使用して、配列にランダム インデックスを生成します。または、それをシャッフルすることもできます (ランダム ライブラリと連携してFischer-Yates Algorithmを使用)。
合成する必要がある場合は、配列を RAM ブロックに配置し、ランダム アドレスを生成します (たとえば、線形フィードバック シフト レジスタを使用します)。
これらはどれも適切にランダムではなく、擬似ランダムであることに注意してください。リモートで暗号化を試みている場合、それらがあなたの望むものになる可能性は低いです。
ランダム性に近づける良い方法は、線形フィードバック シフト レジスタを使用することです。
これがシミュレーションのみの場合は、ieee.math_real からの一様な手順を使用して 0 から 1 の間の実数を取得し、それを配列のインデックス範囲にスケーリングできます。