随机的唯一数字

本文关键字:数字 唯一 随机 | 更新日期: 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方法失败了。

它失败了,因为您的随机生成器没有生成唯一数字。我不确定在目前的情况下会怎样。