我遇到了困难,因为该程序似乎有效但却停留在开发和显示最终数组上。它应该有45个元素,每个数字为1 - 45,但是以随机顺序生成,没有重复。
using System;
namespace RandomArray
{
public class RandomArrayNoDuplicates
{
static Random rng = new Random();
static int size = 45;
static void Main()
{
int [] array = InitializeArrayWithNoDuplicates(size);
DisplayArray(array);
Console.ReadLine();
}
/// <summary>
/// Creates an array with each element a unique integer
/// between 1 and 45 inclusively.
/// </summary>
/// <param name="size"> length of the returned array < 45
/// </param>
/// <returns>an array of length "size" and each element is
/// a unique integer between 1 and 45 inclusive </returns>
public static int[] InitializeArrayWithNoDuplicates(int size)
{
int[] arr = new int[size];
for (int i = 0; i < size; i++)
{
int number = rng.Next(1, size + 1);
arr[i] = number;
if (i > 0)
{
for (int j = 0; j <= i; j++)
{
if (arr[j] == arr[i])
{
i = i - 1;
}
else if (arr[i] != arr[j])
{
arr[i] = number;
}
}
}
}
return arr;
}
public static void DisplayArray(int[] arr)
{
for (int x = 0; x < size; x++)
{
Console.WriteLine(arr[x]);
}
}
}
}
在生成数组中的每个元素之后,应检查元素以检查重复项。关于更好地解决这个问题的提示?
答案 0 :(得分:0)
数组中已有的数字越多,其中已经存在重复的可能性就越大。使用最后一个数字,实际上有44/45的机会获得重复。在最坏的情况下,你必须检查所有44个元素甚至找到重复。只有更多的数组元素才会变得更糟。
我只能重复Leonardos Advise:创建一个包含所需数字的数组。然后扰乱所述数字的顺序。我称之为&#34;彩票问题&#34;并且通常使用两个List(int),因为它是最直观的。我应该能够找到一些示例代码,因为我经常使用它来编写代码。
我jsut在记事本++中做了这个快速的模型代码。可能会混淆长度并计算或搞乱索引,但你应该得到要点。我希望:
List<int> input = new List<int>();
List<int> output;
//Initialise Input
for(int i = 0; i < 45; i++)
input[i]=i;
//Shuffle the array into output
random rng = new Random();
output = new List<int>(input.Lenght);
for(; input.Lenght > 0;){
int index = rng.NextInt(input.Lenght);
int value = input(index);
input.remove(index);
output.add(value);
}
//output is a fully randomized version of input now
&#13;
答案 1 :(得分:0)
是的,同意所有人的意见,生成随机数组比加扰排序数组要昂贵得多。因此,你应该采取加扰选项。
在这方面,请查看此链接Best way to randomize an array with .NET
答案 2 :(得分:0)
您可以使用Random而不是Scramble执行此操作,但您的逻辑有问题。在我的例子中,我构建了一个包含所有可能数字的数组,另一个包含bool,最初为false。每次我使用一个数字我设置习惯为真。然后,下次我将Random的范围减小一个,并从我的数字数组中取出第n个未使用的值。然后在最后(这非常多,你来的地方)最后一个值不是随机的 - 它只是最后一个可用的数字。
另一点,你必须随机播种,否则它根本不是随机的!
代码如下所示:
namespace RandomArray
{
class RandomArrayNoDuplicates
{
static Random rng = new Random(DateTime.Now.Millisecond);
static int size = 45;
static void Main(string[] args)
{
int[] array = InitializeArrayWithNoDuplicates(size);
DisplayArray(array);
Console.ReadLine();
}
/// <summary>
/// Creates an array with each element a unique integer
/// between 1 and 45 inclusively.
/// </summary>
/// <param name="size"> length of the returned array < 45
/// </param>
/// <returns>an array of length "size" and each element is
/// a unique integer between 1 and 45 inclusive </returns>
public static int[] InitializeArrayWithNoDuplicates(int size)
{
int[] allNos = new int[size];
bool[] used = new bool[size];
for (int i = 0; i < size; i++)
{
allNos[i] = i + 1;
used[i] = false;
}
int[] arr = new int[size];
int max = size;
for (int i = 0; i < size - 1; i++)
{
int number = rng.Next(0, max);
int ptr = 0;
for (int j = 0; j < size; j++)
{
if (used[j])
{
ptr++;
}
else
{
if (j == number + ptr)
{
break;
}
}
}
arr[i] = allNos[number + ptr];
used[number + ptr] = true;
max--;
}
for (int i = 0; i < size; i++)
{
if (used[i] == false)
{
arr[size - 1] = allNos[i];
break;
}
}
return arr;
}
public static void DisplayArray(int[] arr)
{
for (int x = 0; x < size; x++)
{
Console.WriteLine(arr[x]);
}
}
}
}
答案 3 :(得分:0)