同时不改变循环外变量的值。我需要制作一种以随机方式对数组进行洗牌的方法。 (C#请)[重复]

Posted

技术标签:

【中文标题】同时不改变循环外变量的值。我需要制作一种以随机方式对数组进行洗牌的方法。 (C#请)[重复]【英文标题】:while not changing the value of a variable outside of the loop. I need to make a method that shuffles the array in a random way. (C# pls) [duplicate] 【发布时间】:2021-08-18 19:14:22 【问题描述】:

该方法采用 1 个数组,并使用随机数对数组进行洗牌,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;

【问题讨论】:

您应该只使用一个 Random 实例。检查:***.com/a/1654902/3888657 【参考方案1】:

不使用字符串,但这说明了一种非常可靠的随机播放方法...

  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,

【讨论】:

以上是关于同时不改变循环外变量的值。我需要制作一种以随机方式对数组进行洗牌的方法。 (C#请)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将变量的值传播到循环外[重复]

C语言 用星号*打印菱形或其他图形 详解

C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效

Python有啥方法可以改变运行中程序的某个变量而不中断执行?

如何使用其中的变量制作随机数变量?

一种以动态库的方式使用资源表的方案