c# Random不能很好地工作

本文关键字:工作 很好 不能 Random | 更新日期: 2023-09-27 17:53:06

我想做一个随机的项目选择器,随机选择3 × 3的项目。概率是不相等的。

namespace Picker
{
    class Program
    {
        static bool doContinue = true;
        static double[] numbers = { 4, 12, 28, 60, 124, 252, 508, 1020, 2044, 4092, 4120, 4176, 4288, 4512, 4960, 5856, 7648, 11232, 18400, 32736 };
        static string Pick()
        {
            double rnd = new Random().NextDouble() * 32736;
            byte type = 0;
            for (byte i = 0; i < 20; i++) {
                if (rnd <= numbers[i])
                {
                    type = i;
                    break;
                }
            }
            string reverString = "";
            if (type < 10)
            {
                reverString = " Reverse";
            }
            return "T" + (10 - (type % 10)).ToString() + reverString;
        }
        static void Main(string[] args)
        {
            while (doContinue)
            {
                Console.WriteLine(Pick());
                Thread.Sleep(2);
                Console.WriteLine(Pick());
                Thread.Sleep(2);
                Console.WriteLine(Pick());
                Thread.Sleep(2);
                Console.ReadLine();
            }
        }
    }
}

3 × 3的选择总是相同的事情3次,然后它改变。

PS:我知道,doContinue的事情没有实现。

c# Random不能很好地工作

一个Random对象基于当前机器时间为自己播种,所以如果你每次调用Pick()都创建一个新的Random对象,它将产生与快速连续调用它的次数相同的次数。

尝试重用Random实例,如下所示:

class Program
{
    static bool doContinue = true;
    static double[] numbers = { 4, 12, 28, 60, 124, 252, 508, 1020, 2044, 4092, 4120, 4176, 4288, 4512, 4960, 5856, 7648, 11232, 18400, 32736 };
    static Random random = new Random();
    static string Pick()
    {
        double rnd = random.NextDouble() * 32736;
        ...