我在做C#编码。在我的编码中,我需要生成一个随机的数字列表。通常,如果我们创建一个随机数,我们需要选择数字的范围。但是对于我的情况,我需要从数组中创建一个随机数。任何的想法?我正在使用XAML和C#。
private void Submit_Click(object sender, RoutedEventArgs e)
{
int[] numbers = new int[5] {32, 67, 88, 13, 50};
Random rd = new Random();
//int myNo = rd.Next(numbers[])?
}
EXTRA :每次点击提交按钮,都会选择随机数 numbers [] 。我怎样才能确保不重复这个数字。例如:第一次点击,myNo = 67;第二次点击,myNo = 50;第3次点击,myNo = 88;第4次点击,myNo = 32;第5次点击,myNo = 13.谢谢!
答案 0 :(得分:12)
您可以创建一个随机数字,表示数组中的索引。从该随机索引访问数组元素,您将得到您的数字,因为数组中的所有数字似乎都是不同的。
int[] numbers = new int[5] { 32, 67, 88, 13, 50 };
Random rd = new Random();
int randomIndex = rd.Next(0, 5);
int randomNumber = numbers[randomIndex];
编辑: (感谢@Corak) 您可以根据数组长度生成随机索引,这将使其动态化并适用于任何数组的长度。
int randomIndex = rd.Next(0, numbers.Length);
编辑2:(有关问题的其他部分)。
您需要在班级维护一个唯一索引号列表。所以你的代码应该是这样的:
Random rd = new Random(); //At class level
List<int> uniqueIndices = new List<int>(); //At class level
private void Submit_Click(object sender, RoutedEventArgs e)
{
int[] numbers = new int[5] {32, 67, 88, 13, 50};
int randomIndex = rd.Next(0, numbers.Length);
while(list.Contains(randomIndex)) //check if the item exists in the list or not.
{
randomIndex = rd.Next(0, numbers.Length);
}
list.Add(randomInex);
//...rest of your code.
}
答案 1 :(得分:3)
Random r = new Random();
int index = r.Next(0, 5);
int randomNum = numbers[index];
这将为您提供0到4之间的随机数,可用于索引数组,然后从数组中提取随机值
答案 2 :(得分:1)
这是一种参数化方式:
randIndex = rd.Next(0, numbers.Length);
int myNo = numbers[randIndex];
答案 3 :(得分:1)
我会创建一个代表随机可枚举的类,然后使用扩展名methond First
生成您应该在数组中使用的第一个索引。它看起来像这样:
class Program
{
static void Main(string[] args)
{
int[] numbers = new int[5] { 32, 67, 88, 13, 50 };
var randomEnumerable = new RandomEnumerable(0, numbers.Length);
int i = 0;
while (i < numbers.Length)
{
var nextIndex = randomEnumerable.First();
var number = numbers[nextIndex];
Console.WriteLine(number);
i++;
}
Console.ReadLine();
}
}
class RandomEnumerable : IEnumerable<int>
{
private readonly int _max;
private readonly int _min;
private Random _random;
public RandomEnumerable(int min, int max)
{
_max = max;
_min = min;
_random = new Random();
}
public IEnumerator<int> GetEnumerator()
{
while (true)
{
yield return _random.Next(_min, _max);
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
答案 4 :(得分:0)
像往常一样创建一个随机索引,并使用该值索引到数组中,而不是直接返回它。
答案 5 :(得分:0)
您必须随机生成数组索引才能从数组中获取随机数。
只应用随机函数生成数组索引范围(0, array.length - 1)
答案 6 :(得分:0)
您可以创建一个随机数,然后使用mod运算符%by 5并将其用作数组的索引。
EG。
modRd = rd % 5; randomNumber = numbers[modRd];
答案 7 :(得分:0)
这将从数组
创建一个随机且唯一的数字 public class Shuffler
{
Random randomNumber;
public Shuffler()
{
randomNumber = new Random();
}
/// <summary>
/// Shuffling the elements of Array
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
public void Shuffle<T>(IList<T> array)
{
for (int n = array.Count; n > 1; )
{
int k = randomNumber.Next(n); //returning random number less than the value of 'n'
--n; //decrease radom number generation area by 1
//swap the last and selected values
T temp = array[n];
array[n] = array[k];
array[k] = temp;
}
}
}
答案 8 :(得分:0)
您可以创建一个包含所有值的字符串,然后获取它的哈希码。然后可以使用该哈希码对随机种子进行种子处理。
使用 HashCode 方法会使种子更依赖于数组的数据。
public static void Main()
{
int[] numbers = new int[5] { 32, 67, 88, 13, 50 };
StringBuilder valuesToBeHashed = new StringBuilder();
for (int i = 0; i < numbers.Length; i++)
{
valuesToBeHashed.Append(numbers[i] + ",");
}
Random rd = new Random(valuesToBeHashed.GetHashCode());
Console.WriteLine("Hashcode of Array : {0} ",valuesToBeHashed.GetHashCode());
Console.WriteLine("Random generated based on hashcode : {0}", rd.Next());
}