5

我正在做一个 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[])?                    
    }

额外:每次我单击提交按钮时,都会选择一个随机数[]。我怎样才能确保号码不重复。例如:第一次点击,myNo = 67;第二次点击,myNo = 50;第三次点击,myNo = 88;第 4 次点击,myNo = 32;第 5 次点击,myNo = 13。谢谢!

4

9 回答 9

14

您可以创建一个随机数来表示数组中的索引。从该随机索引访问数组元素,您将获得您的数字,因为数组中的所有数字似乎都是不同的。

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. 


}
于 2013-04-22T05:24:53.187 回答
3
Random r = new Random();
int index = r.Next(0, 5);

int randomNum = numbers[index];

这将为您提供 0 到 4 之间的随机数,可用于索引您的数组,进而从数组中提取随机值

于 2013-04-22T05:27:03.060 回答
1

这是一种参数化方式:

randIndex = rd.Next(0, numbers.Length);
int myNo = numbers[randIndex];
于 2013-04-22T05:34:33.917 回答
1

我将创建一个代表随机可枚举的类,然后使用扩展方法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();
    }
}
于 2013-04-22T05:40:00.747 回答
0

只需像往常一样创建一个随机索引,并使用该值索引到数组中,而不是直接返回它。

于 2013-04-22T05:24:29.097 回答
0

您必须随机生成数组索引才能从数组中获取随机数。

只需应用随机函数来生成数组索引范围之间的数字(0, array.length - 1)

于 2013-04-22T05:24:31.413 回答
0

您可以创建一个随机数,然后使用 mod 运算符 % by 5 并将其用作数组的索引。

例如。 modRd = rd % 5; randomNumber = numbers[modRd];

于 2013-04-22T05:24:45.183 回答
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;
        }
    }
 }
于 2013-04-22T05:25:49.713 回答
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());
    }
于 2013-04-22T05:35:31.813 回答