2

我是 C# 新手,我正在使用数组制作应用程序。我有一个数组,其数字如下所示:

int[] array2 = new int[] { 1, 3, 5, 7, 9 };

我需要做的是更改数组中这些数字的顺序而不重复,因为当我使用随机函数时,这会显示重复的数字。

我看到了这种方法,但不知道如何将其应用于数字: http: //www.dotnetperls.com/shuffle

4

4 回答 4

5

您可以使用以下 LINQ 链:

int[] array2 = new int[] { 1, 3, 5, 7, 9 };
var random = new Random();
var total = (int)array2.
    OrderBy(digit => random.Next()).
    Select((digit, index) => digit*Math.Pow(10, index)).
    Sum();

首先,它对元素进行随机排序,然后选择每个元素乘以 10 的索引次幂,然后将它们相加并将结果转换为整数。另外,请注意我没有为您的Random实例提供有用的种子。您可能想要这样做,以产生伪随机结果。

您可能还想使用此处描述的求幂方法,以避免强制转换为整数。

编辑:正如 Rhumborl 指出的,你可能只需要洗牌的数组。在这种情况下:

var shuffledArray = array2.OrderBy(n => random.Next()).
   ToArray();

应该为你工作。

于 2013-01-13T15:13:37.130 回答
1

如果您使用 C# 工作,则最好使用 C# 结构。

您可以使用此通用功能

using System;
using System.Collections.Generic;

public static class ListExtensions
{
    public static void Shuffle<T>(this IList<T> list)
    {
        var randomNumber = new Random(DateTime.Now.Millisecond);
        var n = list.Count;
        while (n > 1)
        {
            n--;
            var k = randomNumber.Next(n + 1);
            var value = list[k];
            list[k] = list[n];
            list[n] = value;
        }
    }
}

然后您的代码应如下所示:

List<int> list2 = new List<int>(){1, 3, 5, 7, 9};
Shuffle(list2);
于 2013-01-13T15:22:55.333 回答
0

正如您所说,您已经有一个包含数字的数组可以使用。所以我不会向你展示如何制作一个充满唯一数字的数组。

这就是你如何洗牌你的阵列。

  1. 弄清楚如何生成介于 0 和数组长度之间的随机数。
  2. 编写一个从 length_of_the_array-1 到 0 的循环。(将此索引用作 idx1)

在循环内执行以下操作:

一种。使用步骤 1 中的方法生成一个介于 0 和 idx1(含)之间的随机数。(让随机数为 idx2。)
b.在 idx1 和 idx2 处交换数组中的元素。

可以通过执行以下操作来完成简单的交换:

int tmp = 数组[idx1];
数组[idx1] = 数组[idx2];
数组[idx2] = tmp;

循环结束,你留下一个洗牌的数组。

于 2013-01-13T15:20:59.603 回答
0

我不太清楚你所说的改变顺序而不重复是什么意思。如果您只想生成一个从不重复的随机数,您可以执行以下操作

private Random rand = new Random();
private List<int> used = new List<int>;
protected int randomNonrepeating() {
   int i = rand.next();
   while(used.contains(i))
       i = rand.next();
   used.add(i);
   return i;
}

我的猜测是,这并不是你想要的。如果您只想在提供的链接上修改算法以使用整数数组而不是字符串。您只需要更改类型。像这样的东西

using System;

使用 System.Collections.Generic;使用 System.Linq;

静态类 RandomStringArrayTool { 静态随机 _random = new Random();

public static string[] RandomizeStrings(int[] arr)
{
List<KeyValuePair<int, int>> list = new List<KeyValuePair<int, int>>();
// Add all strings from array
// Add new random int each time
foreach (var s in arr)
{
    list.Add(new KeyValuePair<int, int>(_random.Next(), s));
}
// Sort the list by the random number
var sorted = from item in list
         orderby item.Key
         select item;
// Allocate new string array
int[] result = new string[arr.Length];
// Copy values to array
int index = 0;
foreach (KeyValuePair<int, int> pair in sorted)
{
    result[index] = pair.Value;
    index++;
}
// Return copied array
return result;
}

}

希望这可以帮助。

于 2013-01-13T15:36:34.037 回答