using System; namespace VMdemo.Simulation { public class AddressGenerator { public const int DefaultSeed = 12345; private readonly int _vaBits; private readonly ulong _vaMask; private readonly Random _random; private readonly byte[] _buffer = new byte[8]; public AddressGenerator(int vaBits, int? seed = null) { if (vaBits != 32 && vaBits != 48 && vaBits != 64) { throw new ArgumentOutOfRangeException(nameof(vaBits), "vaBits 仅支持 32、48、64。"); } _vaBits = vaBits; _vaMask = vaBits == 64 ? ulong.MaxValue : (1UL << vaBits) - 1UL; _random = new Random(seed ?? DefaultSeed); } public ulong MaxVirtualAddress => _vaMask; public ulong NextVirtualAddress() { return NextRawUlong() & _vaMask; } private ulong NextRawUlong() { _random.NextBytes(_buffer); return BitConverter.ToUInt64(_buffer, 0); } } }