c# - 同时不改变循环外变量的值。我需要制作一种以随机方式对数组进行洗牌的方法。(C#请)
问题描述
该方法需要 1 个数组并使用 random 对数组进行洗牌,rndm1
-的值4
没有改变。在循环之后,它运行正常。我认为问题出在while循环中。
public static string[] Shuffle(string[] array)
{
string str1, str2, str3, str4;
Random rnd1 = new Random();
Random rnd2 = new Random();
Random rnd3 = new Random();
Random rnd4 = new Random();
int rndm1 = rnd1.Next(3);
int rndm2 = rnd2.Next(3);
int rndm3 = rnd3.Next(3);
int rndm4 = rnd4.Next(3);
while ((rndm1 != rndm2) && (rndm1 != rndm3) && (rndm1 != rndm4)
&& (rndm2 != rndm3) && (rndm2 != rndm4) && (rndm3 != rndm4))
{
rndm1 = rnd1.Next(3);
rndm2 = rnd2.Next(3);
rndm3 = rnd3.Next(3);
rndm4 = rnd4.Next(3);
}
str1 = array[0];
str2 = array[1];
str3 = array[2];
str4 = array[3];
array[rndm1] = str1;
array[rndm2] = str2;
array[rndm3] = str3;
array[rndm4] = str4;
return array;
}
解决方案
不使用字符串,但这说明了一个非常可靠的随机播放方法......
var inputArray = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// Get a rapidly changing seed for the generator (for fun)
var randgen = new Random((int)(DateTime.Now.Ticks % (long)(int.MaxValue) + 1));
var n = inputArray.Length;
var returnArray = new int[n];
for (int i = 0; i < inputArray.Length; i++)
{
var pick = randgen.Next(n); // a number from 0..(n-1)
returnArray[i] = inputArray[pick];
n--;
// after picking an item out of the input array, replace it with the last entry of the input array...
// so that number can't be picked again and the last entry remains in contention
inputArray[pick] = inputArray[n];
}
foreach (var t in returnArray)
Console.Write($"{t}, ");
}
测试运行的输出
9, 4, 1, 3, 7, 10, 5, 8, 6, 2,
推荐阅读
- xamarin.forms - 绑定到嵌套项
- uno-platform - 无法将 ObservableCollection 绑定到 UserControl 中的 DataGrid
- css - 在按钮中的图标和文本标签之间创建空间
- telethon - Telethon - 许多消息有视图=无
- safari - webRTC safari on点击黑屏
- r - 将不同年份的时间序列绘制在一起
- c# - 剃刀页面部分视图中加载的分页数据
- node.js - 如何在单个 docker 容器中运行多个 jar
- google-analytics - 如何在服务器端实现 Google Analytics Enhanced Ecommerce?
- mongodb - 如何根据 MOngoDB 聚合中的条件查找计数?