【问题标题】:Random Numbers All The Same随机数都一样
【发布时间】:2013-11-21 19:58:59
【问题描述】:

我对 c# 很陌生,我正在尝试创建一个沙盒类型的游戏,我使用随机数来选择块去哪里,但我的块总是相同的,因为它总是选择相同的“随机数” .这是我的代码:

    int x = 0; 

    public GameWindow() 
    {
        InitializeComponent();
        Blocks();
    }

    private void BlockThree()
    {

    }

    private void BlockTwo()
    {
        x = 2;
        BlockData();
    }

    private void BlockOne()
    {
        x = 1;
        BlockData();
    }

    private async void Blocks()
    {
        await Task.Delay(5000);
        BlockOne();
        await Task.Delay(5000);
        BlockTwo();
        await Task.Delay(5000);
        BlockThree();
    }

    private async void BlockData()
    {
        Random rand = new Random();

        int num = rand.Next(1, 2);

        if (num == 1)
        {
            if (x == 1)
            {
                pictureBox1.Image = Image.FromFile("C:/Program Files (x86)/SandBoxEngine/grass_side.png");
            }
            else
            {
                if (x == 2)
                {
                    pictureBox2.Image = Image.FromFile("C:/Program Files (x86)/SandBoxEngine/grass_side.png");
                }
            }
        }
        else
        {
            if (num == 2)
            {
                if (x == 1)
                {
                    pictureBox1.Image = Image.FromFile("C:/Program Files (x86)/SandBoxEngine/dirt.png");
                }
                else
                {
                    if (x == 2)
                    {
                        pictureBox2.Image = Image.FromFile("C:/Program Files (x86)/SandBoxEngine/dirt.png");
                    }
                }
            }
        }   
    }
}

【问题讨论】:

  • 只使用 1 个Random 实例,否则你几乎总是会得到相同的随机数。
  • c# random string generator 的可能重复项
  • (基本上有很多重复的内容。)另见csharpindepth.com/Articles/Chapter12/Random.aspx
  • 如果您在短时间内创建多个Random 实例,它们都将返回相同的序列。生成一个并将其存储在一个字段中。使用多线程时不要忘记使用适当的锁定,Random 不是线程安全的。

标签: c# random numbers


【解决方案1】:

您需要将 Random 指定为全局。

    private Random rand = new Random();

然后使用 rand.Next

还有

    rand.Next(1,2);

将始终返回 1。 得到 1 或 2 使用这个。

    rand.Next(1,3);

【讨论】:

  • 您还会发现低位趋向于 0,1,0,1,0,1(至少以前如此)。
  • 感谢您,它似乎仍然无法正常工作,而且随机全局也会给我一个错误。
  • 你能说明你是如何使它成为全球性的吗?错误是什么?
  • @DavidVenegoni,Random 的无参数构造函数,“使用与时间相关的默认种子值初始化 Random 类的新实例”,因此使用 DateTime.Now.Millisecond 播种可能会赢。没有帮助。此外,由于一秒钟只有 1000 毫秒,这会将可能的种子限制为 [0, 999] 中的值,而不是可能的 [0, Int32.MaxValue],从而极大地损害了有效随机性。
  • @c45207 你是对的,我咨询了 MSDN,它使它成为全局并使用默认的无参数构造函数是正确的解决方案。为我最初的评论道歉,感谢您澄清我的错误。
猜你喜欢
  • 2020-11-21
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
相关资源
最近更新 更多