随机的唯一数字
本文关键字:数字 唯一 随机 | 更新日期: 2023-09-27 18:26:52
我知道网上有很多关于它的问题,但我想知道为什么我的方法失败了我做错了什么?
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);
}
}
编辑测试方法失败了!!很抱歉没有提到
感谢您的时间和建议
除非你非常幸运,否则你怎么可能期望一组10000个可能值中的10000个随机数序列都是唯一的?你所期望的是错误的。
掷硬币两次。你真的希望TH和HT是唯一可能的序列吗?
是什么让你认为随机数应该以不同的方式工作?
随机数生成器的输出是可能的:
1, 1, 1, 1, 1, 1, ..., 1
这就是:
1, 2, 3, 4, 5, 6, ..., 10000
事实上,这两个序列的可能性是一样的!
您似乎误解了Random
类生成了一个唯一序列,尽管它显然是随机数。事实并非如此;随机性意味着下一个数字可以是任何可能的选择,而不仅仅是任何,除了我以前见过的。
在这种情况下,你的测试失败也就不足为奇了:10000个随机生成的整数(在1到10000之间)是唯一的概率很小。
随机!=独特的
这里的重点是,您的代码应该为您的问题建模,而您的代码实际上没有。随机不等于唯一。如果你想要唯一的,你需要得到你的一组值并对它们进行洗牌。
如果你真的想要随机数,你不能指望它们是唯一的。如果你的(P)RNG提供了均匀分布,那么在许多试验中,你应该看到每个值的相似计数(参见大数定律)。案例可能看起来"错误",但你不能忽视你偶然遇到的案例。
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);
我想您没有提到您的test
方法失败了。
它失败了,因为您的随机生成器没有生成唯一数字。我不确定在目前的情况下会怎样。