随机数组问题

时间:2013-06-26 14:37:31

标签: c# arrays random

我在这部分的代码中遇到了问题:

Random rand = new Random();
string[] MyRandomArray = choices.OrderBy(x => rnd.Next()).ToArray();
string[] newArray = new string[4];

int num = 0;

for (num = 0; num < 3; num++)
{
    newArray[num] = MyRandomArray[num];
}

newArray[num] = "1";

string[] finalArray = newArray.OrderBy(x => rnd.Next()).ToArray();
this.radioButton1.Text = newArray[0];
this.radioButton2.Text = newArray[1];
this.radioButton3.Text = newArray[2];
this.radioButton4.Text = newArray[3];

我要做的是在单选按钮1,2,3和4中的newArray中获取不同的数组位置。但是,我在我指定的最后一个数组中遇到了问题。它不包含在随机播放中,因此我得到的唯一随机值是单选按钮1,2和3.每当我尝试重新启动程序时,单选按钮4保持不变。

1 个答案:

答案 0 :(得分:0)

关于随机抽样和潜在问题的一句话:

Random Class在生成独特的随机数序列方面存在一些限制,请参阅文档的“备注”部分:

  1. 具体来说,因为Random的默认构造函数初始化 使用基于系统时钟的种子,您可以重复 重复初始化Random实例时的序列 很快。之前引用的备注部分包括 用于演示此问题的代码。
  2. 无法保证调用Random类实例的方法 是线程安全的。所以使用Random的单个实例来避免 播种问题可能会遇到其他线程问题。
  3. 使用Guid.NewGuid Method对一组进行采样将为生成随机排序提供更好的结果,因为如果快速连续调用它将不会重复序列。但是,它确实带来了一些警告:

    1. 虽然它在卡方检验中作为随机选择器表现良好, 它不适用于加密目的,也不是直接目的 替代实际的随机数发生器。
    2. 只要NewGuid生成的GUID是版本4 GUID,就可以了 GUID确实包含随机内容;但是,这可能 改变未来。微软尚未发表任何声明 保证GUID将包含随机内容,仅限于它们 独特的,碰撞概率极低。
    3. 以下是使用NewGuid的内容:

      string[] myRandomArray = choices.OrderBy(x => Guid.NewGuid()).Take(3).ToArray();
      

      使用RNGCryptoServiceProvider Class是产生可靠随机抽样的最佳解决方案。它既是线程安全的,也不会受到Random Class所具有的种子问题的影响。但是,它确实需要更多代码来实现。

      // TODO: Add code to demonstrate using RNGCryptoServiceProvider
      

      您可以使用take而不是For循环,因为您已经在使用LINQ:

      // Get 3 random choices in a List.
      List<string> myChoices = choices.OrderBy(x => Guid.NewGuid()).Take(3).ToList();
      
      // Add the correct answer.
      myChoices.Add(theAnswer);
      
      // Randomize the resulting set of 4 choices into an Array.
      string[] myRandomizedChoices = myChoices.OrderBy(x => Guid.NewGuid()).ToArray();
      
      this.radioButton1.Text = myRandomizedChoices[0];
      this.radioButton2.Text = myRandomizedChoices[1];
      this.radioButton3.Text = myRandomizedChoices[2];
      this.radioButton4.Text = myRandomizedChoices[3];