c# - 为什么我得到重复的随机数?
问题描述
我想显示具有许多任务的随机数字,但结果是我得到了重复的数字
for (int i = 0; i < 500; i++)
{
Task.Factory.StartNew(() =>
{
string a = new Random().Next(0, 999999).ToString();
richTextBox1.Invoke(new Action(() =>
{
richTextBox1.AppendText(a + "\n");
}));
});
}
691241 691241 691241 691241 691241 691241 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621
我还有另一个关于任务和线程的问题
,类不是静态的重要吗,例如,如果我想用线程/任务发送多个 POST 查询?
解决方案
您需要在 FOR 循环的外部声明 Random 实例......
然后在里面重用那个实例。您可能还想“锁定”对随机类的调用,以便两个调用不会同时发生。
var synRoot = new object();
var rand = new Random();
for (int i = 0; i < 500; i++)
{
Task.Factory.StartNew(() =>
{
lock(syncRoot)
{
//lock to avoid multiple threads calling at the same time.
string a = rand.Next(0, 999999).ToString();
richTextBox1.Invoke(new Action(() =>
{
richTextBox1.AppendText(a + "\n");
}));
}
});
}
原因是 Random 类使用内部时钟的分辨率为自身播种......所以这意味着如果 2 个或更多任务在该分辨率窗口内创建一个新实例,则两个实例将具有相同的 SEED。
为了避免这种情况,您需要重用单个实例。
推荐阅读
- javascript - preventDefault 在 Laravel Mix 和 Laravel Collective 中未被识别
- reactjs - 用于调度动作的 React 返回函数代码块总是跳过并且不返回任何内容
- amazon-web-services - Dockerfile - 在 AWS 上安装 jenkins
- android - Build.gradle 无法解析 com.android.support
- jquery - 使用 AJAX 调用 Micronaut 服务失败
- lambda - 跨单独的 RDD 对象应用 lambda 函数
- javascript - CropperJS 在页面上创建新图像而不是裁剪指定的图像
- c# - 如何从字符串中删除一系列单个字母?
- python - 关闭 python 脚本后如何删除泡菜文件?
- xamarin - 如何在调试模式下将 Xamarin (Android) APK 部署到我的手机