我知道网上有很多关于它的问题,但我想知道为什么我的方法失败了 我做错了什么?
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 测试方法失败!!很抱歉没有提及
感谢您的时间和建议
答案 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);