我现在已经盯着自己,所以请帮忙。
当我在循环内调用此方法两次时,它返回相同的值。为什么?
public async Task<int> RollDice() {
var rnd = new Random();
var selected = 0;
await Task.Run(() => {
selected = rnd.Next(1, 6);
});
return selected;
}
答案 0 :(得分:6)
您必须在方法之外初始化Random
对象,以防止使用相同的种子一次又一次地初始化它,从而返回相同的值。
重要的是要注意,正如LukeH在评论中正确添加的那样,System.Random
类不线程安全,不应在单独的线程中的任务之间共享。
答案 1 :(得分:2)
您正在使用Random
类的两个实例。使用parameterless constructor,随机数生成器使用基于系统时钟的值进行播种。
这意味着如果您在彼此之后不久创建两个Random
个实例,它们将使用相同的值进行初始化,因为系统时钟具有有限的分辨率。拥有相同的种子意味着这两个实例将产生相同的结果序列。
一些谷歌搜索显示使用Random
交叉线程会导致它断开并返回无穷无尽的零序列,所以如果你必须多线程代码的这个特定部分,你可能想看一下this article关于如何创建Random
类的单个线程安全版本。