从c#中给出数字生成随机数

时间:2011-07-26 11:25:18

标签: c# arrays random

用户将数字输入10个文本框,然后将其发送到数组。现在我想从这个数组中生成随机数。我该怎么办?

2 个答案:

答案 0 :(得分:3)

这样的事情:

public class Randomizer<T>
{
    private readonly Random _random = new Random();
    private readonly IList<T> _numbers;
    public Randomizer(IList<T> numbers)
    {
        _numbers = numbers;
    }

    public T Next()
    {
        int idx = _random.Next(0, _numbers.Count);
        return _numbers[idx];
    }
}

用法:

var r = new Randomizer<int>(new int[] { 10, 20, 30, 40, 50 });
for (int i = 0; i < 100; i++)
     Console.Write(r.Next() + " ");

或者你想要shuffle the array

<强> [编辑]

要对数组进行随机播放,您可以使用Fisher–Yates shuffle中显示的this post

// https://stackoverflow.com/questions/108819/110570#110570
public class Shuffler
{
    private Random rnd = new Random();
    public void Shuffle<T>(IList<T> array)
    {
        int n = array.Count;
        while (n > 1)
        {
            int k = rnd.Next(n);
            n--;
            T temp = array[n];
            array[n] = array[k];
            array[k] = temp;
        }
    }
}

如果您希望界面与上面的Randomizer类相同,您可以修改它以使用Shuffler类:

public class Randomizer<T>
{
    private readonly Shuffler _shuffler = new Shuffler();
    private readonly IList<T> _numbers;
    public Randomizer(IList<T> numbers)
    {
        _numbers = new List<T>(numbers);
        _shuffler.Shuffle(_numbers);
    }

    volatile int idx = 0;
    public T Next()
    {
        if (idx >= _numbers.Count)
        {
            _shuffler.Shuffle(_numbers);
            idx = 0;
        }

        return _numbers[idx++];
    }
}

请注意,代码不是线程安全的,因此如果可以从多个线程同时调用Next方法,则应实现某些锁定。

答案 1 :(得分:1)

Seed带有数组值的标准System.Random类?如果您需要随机数来依赖所有数组项,那么只需对它们进行异或。

public static Random BuildSeededRandom(int[] data)
{
    if ( data == null || data.Length < 1 )
        return new Random();

    int xor = 0;
    foreach ( var i in data )
        xor ^= i;

    return new Random(xor);
}