随机的唯一号码?

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

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(); for (int i = 1; i < 10000; i++) { var random = Generator.GetRandomNumber(1,10000); numbers.Add(random); } CollectionAssert.AllItemsAreUnique(numbers); } } 

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

感谢您的时间和建议

 public static void FisherYatesShuffle(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); 

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

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

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

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

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

这是这样的:

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

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

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

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

随机!=独特

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

如果你真的想要随机数,你不能指望它们是唯一的。 如果您的(P)RNG提供均匀分布,那么在许多试验中,您应该看到每个值的类似计数(参见大数定律 )。 案件可能显示似乎“错误”,但你不能打折你偶然遇到这种情况。

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

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