随机的唯一号码?

时间:2012-03-06 21:24:06

标签: c#

我知道网上有很多关于它的问题,但我想知道为什么我的方法失败了 我做错了什么?

public class Generator
{

    private static readonly Random random = new Random();

    private static readonly object SyncLock = new object();

    public static int GetRandomNumber(int min, int max)
    {
        lock (SyncLock)
        { 
            return random.Next(min, max);
        }
    }

}


[TestFixture]
public class Class1
{
    [Test]
    public void SimpleTest()
    {

        var numbers=new List<int>();
        for (int i = 1; i < 10000; i++)
        {
            var random = Generator.GetRandomNumber(1,10000);
            numbers.Add(random);
        }

        CollectionAssert.AllItemsAreUnique(numbers);

    }
}

EDIT 测试方法失败!!很抱歉没有提及

感谢您的时间和建议

5 个答案:

答案 0 :(得分:14)

除非你非常幸运,否则你怎么可能期望一组10,000个可能值中的10,000个随机数序列都是唯一的?你期待的是错误的。

翻转硬币两次。你真的希望TH和HT成为唯一可能的序列吗?

是什么让你认为随机数应该有所不同?

随机数生成器的输出是可能的:

1, 1, 1, 1, 1, 1, ..., 1

这就是:

1, 2, 3, 4, 5, 6, ..., 10000

事实上,这两个序列同样可能!

答案 1 :(得分:2)

随机!=唯一

这里的要点是你的代码应该为你的问题建模,你的代码真的没有。随机不等于唯一。如果你想要独一无二,你需要得到你的价值观并随意洗牌。

如果你真的想要随机数,你就不能期望它们是唯一的。如果您的(P)RNG提供均匀分布,那么通过许多试验,您应该看到每个值的类似计数(参见Law of Large Numbers)。案件可能会出现似乎“错误”的情况。但你不能打折你偶然遇到的情况。

答案 2 :(得分:2)

您似乎误以为Random类会生成一系列唯一,但显然是随机数。这根本不是那么回事;随机性意味着下一个数字可能是任何可能的选择,而不仅仅是任何,除了我之前见过的

在这种情况下,你的测试失败是完全不足为奇的:10000随机生成的整数(1到10000之间不小于)的概率是唯一的,这是微不足道的。

答案 3 :(得分:0)

我认为你没有提到你的test方法失败了。

失败是因为您的随机生成器没有生成唯一数字。我不确定它的现状如何。

答案 4 :(得分:0)

public static void FisherYatesShuffle<T>(T[] array)
{
    Random r = new Random();
    for (int i = array.Length - 1; i > 0; i--)
    {
        int j = r.Next(0, i + 1);
        T temp = array[j];
        array[j] = array[i];
        array[i] = temp;
    }
}

int[] array = new int[10000];

for (int i = 0; i < array.Length; i++) array[i] = i;
FisherYatesShuffle(array);