【问题标题】:2 instances of class using random number2个使用随机数的类实例
【发布时间】:2014-05-21 05:17:58
【问题描述】:

所以我正在尝试学习一些 C#,目前正在学习编程入门的短期课程。我的教科书中有一个问题,这给了我对这篇文章的几乎类似的结果Same random numbers from instantiated class

我尝试遵循解决方案,但每次都得到相同的结果,任务是掷两个骰子并使用类的 2 个实例显示它们的数字。但就像帖子上面的“骰子”角色一样编号。如果我两次调用类的同一个实例并将值放到单独的标签中,我会得到完全不同的值,就像我想要的那样。这是课程:

namespace CH10_Ex10._5
{
public class ThrowDice
{

    public ThrowDice()
    {

    }

    private Random newRandom = new Random(); 

    private int x;

    public void Throw()
    {

        x = newRandom.Next(1, 7);


    }

    public int value
    {
        get
        {
            return x;
        }
    }
}
}

这是我的主要形式:

namespace CH10_Ex10._5
{
public partial class Form1 : Form
{
    ThrowDice Die1;
    ThrowDice Die2;

    public Form1()
    {
        InitializeComponent();
        Die1 = new ThrowDice();
        Die2 = new ThrowDice();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Die1.Throw();
        dieOneLabel.Text = Convert.ToString(Die1.value);
        Die2.Throw();


        dieTwoLabel.Text = Convert.ToString(Die2.value);
    }
}
}

我试图在不打开新帖子的情况下找到答案,所以如果之前已经回答过,我很抱歉。我对此很绿色。

我的理解是,如果我用 new 声明对象,那么我将创建类的单独实例,因此当我调用这些对象时,它们应该独立/单独运行,但使用我的类中指定的相同规则。我尝试调试,当我单步执行代码时,我看到了对类的 2 个单独调用,看起来调用 1 生成了一个随机数,例如 6,调用 2 似乎也生成了 6。

提前致谢

【问题讨论】:

    标签: c# class random


    【解决方案1】:

    我常用的:

    private Random newRandom = new Random(Guid.NewGuid().GetHashCode());
    

    【讨论】:

    • 我不确定他的问题是什么,但我认为这不能回答。
    • 他的问题是他使用相同的种子,因为实例化太接近了。如果他将 Guid.NewGuid().GetHashCode() 添加到他的随机声明中,他每次都会得到不同的种子。那样的话,他的掷骰子会有所不同......嗯......并不总是相同的:P
    【解决方案2】:

    问题是随机实例将使用当前时间初始化,因为您使用的是默认构造函数。由于这在两个实例上发生得非常快,所以它们在这里得到了相同的种子:

    public Form1()
    {
        InitializeComponent();
        Die1 = new ThrowDice();
        Die2 = new ThrowDice();
    }
    

    您可以将其设为静态:

    private static Random newRandom = new Random(); 
    

    Random constructor:

    默认种子值源自系统时钟,具有有限的 解决。结果,不同的随机对象在 通过调用默认构造函数的紧密继承将具有 相同的默认种子值,因此,将产生相同的 随机数集

    但是,Random 不是线程安全的。所以你应该看看this answer.

    这也非常值得一读:C# in Depth: Random numbers 建议使用 ThreadLocal<T>,这是 .NET 4 中的新功能,而不是带锁的 static

    【讨论】:

    • 你说得对,对不起,我对此感到困惑 :) 你不能从静态方法访问实例变量。
    • 这非常感谢。我在课堂上做了随机静态。
    【解决方案3】:

    您可以在两个实例中使用相同的随机实例来解决此问题。例如,您可以添加这样的构造函数:

    private Random newRandom;
    public ThrowDice(Random rnd)
    {
        newRandom = rnd;
        x = newRandom.Next(1, 7);
    }
    

    然后:

    Random rnd = new Random;
    public Form1()
    {
        InitializeComponent();
    
        Die1 = new ThrowDice(rnd);
        Die2 = new ThrowDice(rnd);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 2019-05-07
      相关资源
      最近更新 更多