2

我现在对此视而不见,所以请帮忙。

当我在循环内调用此方法两次时,它返回相同的值。为什么 ?

public async Task<int> RollDice() {
    var rnd = new Random();
    var selected = 0;

    await Task.Run(() => {
        selected = rnd.Next(1, 6);
        });

    return selected;
}
4

2 回答 2

7

您必须Random在方法之外初始化对象,以防止它使用相同的种子一遍又一遍地初始化,从而返回相同的值。

重要的是要注意,正如 LukeH 在注释中正确添加的那样,System.Random该类不是线程安全的,不应在不同线程中的任务之间共享。

于 2013-04-11T08:59:05.893 回答
2

您正在使用Random该类的两个实例。使用无参数构造函数,随机数生成器使用基于系统时钟的值播种。

这意味着如果您在Random不久之后创建两个实例,它们将使用相同的值进行初始化,因为系统时钟具有有限的分辨率。拥有相同的种子意味着这两个实例将产生相同的结果序列。

一些谷歌搜索显示,使用Random跨线程可能会导致它中断并返回无穷无尽的零序列,因此如果您必须对代码的这一特定部分进行多线程处理,您可能需要查看这篇文章,了解如何创建单个类的线程安全版本Random

于 2013-04-11T09:00:10.193 回答