我在这部分的代码中遇到了问题:
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保持不变。
答案 0 :(得分:0)
关于随机抽样和潜在问题的一句话:
Random Class在生成独特的随机数序列方面存在一些限制,请参阅文档的“备注”部分:
使用Guid.NewGuid Method对一组进行采样将为生成随机排序提供更好的结果,因为如果快速连续调用它将不会重复序列。但是,它确实带来了一些警告:
以下是使用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];