加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在多个线程中使用Random共享相同的方法

发布时间:2020-12-16 01:58:22 所属栏目:百科 来源:网络整理
导读:我正在使用跟随xaml创建一个简单的赛车应用程序 StackPanel Slider x:Name="racerOne" Maximum="1000"/ Slider x:Name="racerTwo" Maximum="1000"/ Button Content="Start Race" Click="myButton_Click"//StackPanel 我使用以下代码 private void myButton_C
我正在使用跟随xaml创建一个简单的赛车应用程序

<StackPanel>
    <Slider x:Name="racerOne" Maximum="1000"/>
    <Slider x:Name="racerTwo" Maximum="1000"/>
    <Button Content="Start Race" Click="myButton_Click"/>
</StackPanel>

我使用以下代码

private void myButton_Click(object sender,RoutedEventArgs e)
    {
        Task firstRacer = Task.Run(() => Race(racerOne));
        Task secondRacer = Task.Run(() => Race(racerTwo));
    }

    private void Race(Slider racer)
    { 
        int step = 0;

        while (step < 1000)
        {
            step += new Random().Next(0,10);
            Dispatcher.BeginInvoke(new ThreadStart(() => racer.Value = step));
            Thread.Sleep(new Random().Next(0,300));
        }
    }

大多数时候(比如90%的前提)两个滑块似乎一起移动,而在调试中我可以看到每个线程为步骤生成不同的值.怎么会?

解决方法

随机是由时钟播种的;你可能想做类似的事情:

Random rand1 = new Random();
Random rand2 = new Random(rand1.Next());
Task firstRacer = Task.Run(() => Race(racerOne,rand1));
Task secondRacer = Task.Run(() => Race(racerTwo,rand2));

private void Race(Slider racer,Random rand)
{ 
    int step = 0;

    while (step < 1000)
    {
        step += rand.Next(0,10);
        Dispatcher.BeginInvoke(new ThreadStart(() => racer.Value = step));
        Thread.Sleep(rand.Next(0,300));
    }
}

这将创建两个具有不同种子的单独Random实例(通过使用1st来播种第二个),然后将这些实例作为参数传递给Race.这消除了由于时间而导致过度可预测行为的风险.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读