c# - 不同过程中随机数相同
问题描述
我正在使用以下代码生成唯一的应用程序实例 ID 以进行日志记录。
public MainWindow()
{
InitializeComponent();
Random rnd = new Random();
instanceID = rnd.Next(100000, 999999);
/// ...
}
我的应用程序从 windowsserver 开始,作为不同的服务(使用 nssm)2 次或更多次具有不同的参数。我的问题:如果它们同时开始(同一秒),则 instanzID 相同,如果 1 秒或更多秒差异 instanzID 不同。我怎样才能避免这种情况?
解决方案
好吧,Random
不是线程安全的(你 提到了“服务器作为不同的服务”),这就是为什么让每个线程都有自己的实例:Random
private static ThreadLocal<Random> MyRandom = ...
由于我们不希望所有这些实例生成相同的序列,让我们提供一个熵源,我们可以借助以下方法来做到这一点RNGCryptoServiceProvider
:
using System.Security.Cryptography;
using System.Threading;
...
private static ThreadLocal<Random> MyRandom = new ThreadLocal<Random>(() => {
int seed;
using (RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider()) {
byte[] seedData = new byte[sizeof(int)];
provider.GetBytes(seedData);
seed = BitConverter.ToInt32(seedData, 0);
}
return new Random(seed);
});
现在,MyRandom
是线程安全的,每个线程都有自己的(伪)随机序列。
instanzID = MyRandom.Next(100000, 999999);
推荐阅读
- python - 如何以设定的频率从给定日期对 DataFrame 进行下采样
- sql - SQL Server 中 2 个不同日期列的每周计数
- ios - Flutter 应用本地化在 iOS 上不起作用
- java - 如何使用 JSoup 抓取这个特定元素?
- javascript - Javascript | 如何使用类名打印第二个元素
- android - 当我关闭手机的互联网时,Kotlin 的 URL.readText() 崩溃
- python-3.x - 如何使用多项逻辑回归解决多标签分类问题?
- javascript - 转换到但保持相同的功能
- mysql - MySQL innoDB 获得有效的行数
- javascript - 全局变量问题,函数回调时,变量没有变化