考虑我有以下代码:
public sealed class SimpleRandomProvider : IRandomProvider
{
private static readonly Lazy<Random> RandomHolder = new Lazy<Random>(() => new Random());
public void NextBytes(byte[] buffer)
{
RandomHolder.Value.NextBytes(buffer);
}
}
不幸的是,每当我在NextBytes
System.Random
中呼叫buffer
时,都会填充空字节:
奇怪的是,X
的{{1}}(约100)次调用工作正常。
发生了什么事? 可能是.Net Core中的错误?
调用生成的代码:
NextBytes
用于生成低于指定do
{
randomProvider.NextBytes(bytes);
bytes[bytes.Length - 1] &= 0x7F;
result = new BigInteger(bytes);
} while (result >= maxExclusive || result.Equals(BigInteger.One) ||
result.Equals(BigInteger.Zero));
的{{1}}。
在开始生成填充零的缓冲区之前(在单元测试运行期间),将片段避免称为100-200次。
修改:
您可以下载我的项目:https://github.com/pwasiewicz/big-prime-number - 然后运行测试 - 它应该失败,因为只有当缓冲区为空时才会抛出InvalidOperationException。
逐个运行测试时。但是运行它们(在VS中全部运行)会导致异常。
答案 0 :(得分:2)
事实证明,对NextBytes
的多线程访问存在问题:
private static readonly Lazy<Random> RandomHolder = new Lazy<Random>(() => new Random());
private static readonly object Access = new object();
public void NextBytes(byte[] buffer)
{
lock (Acces)
RandomHolder.Value.NextBytes(buffer);
}