随机不是随机的,在Windows Phone 7上随机类

时间:2011-10-05 12:17:13

标签: c# windows-phone-7 random

所以,这是交易。

我为wp7设置了一个应用程序,其中有一个包含50个引号的数组。当用户单击按钮时,将显示阵列中的随机引用。问题是,引号总是以相同的顺序出现。例如,报价为1-50。订单总是2,4,20,31,10 ...... 有办法解决这个问题吗?我希望每次使用该应用程序时都会出现一个随机且不同的引号。

以下是代码:

    string[] listaCantadas;
    Random r1, r2;

    public MainPage()
    {
        InitializeComponent();

        listaCantadas = new string[]
        {"//set of quotes
        };

        r1 = new Random(100);
        r2 = new Random(r1.Next(0, 50));
    }

    //click event for display a random quote

            int Cantada = r2.Next(0, listaCantadas.Length - 1);
            txtBlockCantada.Text = listaCantadas[Cantada];

        });
    }

8 个答案:

答案 0 :(得分:14)

您使用Random创建Random(100)的第一个实例,即一个常量种子。所以它总会返回相同的序列。这反过来意味着第二个Random实例的种子也将是常量,并且它返回的所有值也都是。

只需使用默认构造函数Random创建new Random()的单个实例即可。这是随时间播种的,因此在不同的节目运行之间可能会有所不同。

警告:由于时间仅每隔几毫秒(在典型的Windows计算机上为1-16ms)发生变化,如果您使用默认构造函数快速连续创建多个Random实例,则它们很可能都会返回相同的序列。

另一个常见的陷阱是Random不是线程安全的。但看起来你不会遇到这个问题。

string[] listaCantadas;
Random r;//No need for more than one instance

public MainPage()
{
    InitializeComponent();

    listaCantadas = new string[]
    {"//set of quotes
    };

    r = new Random();
}

//click event for display a random quote

        int Cantada = r.Next(0, listaCantadas.Length - 1);
        txtBlockCantada.Text = listaCantadas[Cantada];

    });
}

答案 1 :(得分:4)

您明确说明种子:

r1 = new Random(100);
r2 = new Random(r1.Next(0, 50));

r1将始终使用相同的种子(100),因此r1.Next(0, 50)将始终提供相同的种子,因此r2将始终使用相同的种子。你没有真正的随机性。

您应该创建Random的单个实例并重用它 - 同时注意Random不是线程安全的。 (如果您只是要从UI线程中使用您的实例,那很好。)

有关详细信息,请参阅我的article on random number generation in .NET

答案 2 :(得分:2)

除非您想要可重复的序列,否则不应该使用固定种子为随机生成器播种:

new Random(100);

应该是

new Random();

答案 3 :(得分:2)

嗯,你初始化种子,你的r1随机发生器总是100。这当然意味着根据种子,你将获得相同的数字。这意味着您的r2始终使用相同的种子进行初始化,因此r1和r2始终相同。

PC无法使用随机数,这听起来很奇怪。因此,您需要一个“随机”数字来初始化随机生成器。

长话短说。删除第一个随机对象,并在第二个使用空constructor

  

默认种子值是从系统时钟派生的,并且是有限的   分辨率

答案 4 :(得分:1)

你每次都用相同的种子播种它。只需使用new Random()即可。如果在WP7上不可用,请使用当前时间的导数作为种子。

答案 5 :(得分:1)

种子总是一样的,甚至是从另一个随机的初始化!

尝试以另一种方式播种:

new Random(unchecked((int) (DateTime.Now.Ticks)));

答案 6 :(得分:0)

你有同样的种子。使用类似于当前日期生成的数字

r1 = new Random(DateTime.Now.Year + DateTime.Now.Month + DateTime.Now.Day + DateTime.Now.Second); // etc

答案 7 :(得分:0)

只需使用以下代码;

Random r = new Random();

        private void Form1_Load(object sender, EventArgs e)
        {
            string[] listaCantadas = 
            {
                "q1",
                "q2",
                "q3",
                "q4",
                "q5"
            };

            //click event for display a random quote
            txtBlockCantada.Text = listaCantadas[r.Next(0, listaCantadas.Length)]; 
        }