我是 C# 新手,我正在使用数组制作应用程序。我有一个数组,其数字如下所示:
int[] array2 = new int[] { 1, 3, 5, 7, 9 };
我需要做的是更改数组中这些数字的顺序而不重复,因为当我使用随机函数时,这会显示重复的数字。
我看到了这种方法,但不知道如何将其应用于数字: http: //www.dotnetperls.com/shuffle
我是 C# 新手,我正在使用数组制作应用程序。我有一个数组,其数字如下所示:
int[] array2 = new int[] { 1, 3, 5, 7, 9 };
我需要做的是更改数组中这些数字的顺序而不重复,因为当我使用随机函数时,这会显示重复的数字。
我看到了这种方法,但不知道如何将其应用于数字: http: //www.dotnetperls.com/shuffle
您可以使用以下 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();
应该为你工作。
如果您使用 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);
正如您所说,您已经有一个包含数字的数组可以使用。所以我不会向你展示如何制作一个充满唯一数字的数组。
这就是你如何洗牌你的阵列。
在循环内执行以下操作:
一种。使用步骤 1 中的方法生成一个介于 0 和 idx1(含)之间的随机数。(让随机数为 idx2。)
b.在 idx1 和 idx2 处交换数组中的元素。
可以通过执行以下操作来完成简单的交换:
int tmp = 数组[idx1];
数组[idx1] = 数组[idx2];
数组[idx2] = tmp;
循环结束,你留下一个洗牌的数组。
我不太清楚你所说的改变顺序而不重复是什么意思。如果您只想生成一个从不重复的随机数,您可以执行以下操作
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;
}
}
希望这可以帮助。