gpt4 book ai didi

C# 生成随机 int - 神秘

转载 作者:行者123 更新时间:2023-11-30 14:38:35 25 4
gpt4 key购买 nike

在生成随机整数时,我发现了一些有趣的事情(至少对我而言),我无法向自己解释,所以我想我会把它贴在这里。

我的需求很简单:我要生成随机积分 (Int32) ID 并旨在最大程度地减少冲突。生成时间不是问题。

我尝试了这些生成随机整数的方法:

1.)

   return rnd.Next();

其中 rnd 是方法 #3 中带有种子的随机类型的类字段。

2.)

   return rnd.Next(Int32.MinValue, Int32.MaxValue);

其中 rnd 再次是类型为 Random with Seed 的类字段,来自方法 #3。

3.)

   var buffer = new byte[sizeof(int)];
using (var rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(buffer);
}
return BitConverter.ToInt32(buffer, 0);

注意:我还尝试在包含类的初始化时将 RNGCryptoServiceProvider 作为类字段初始化一次,以简化 GC 的工作,但我用了相同的时间来生成,所以我认为这会“更随机”。

4.)

   return new Random(Method3()).Next();

5.)

   return new Random(Method3()).Next(Int32.MinValue, Int32.MaxValue);

我知道,每次调用都创建 new Random(int seed) 很耗时,但冲突较少,对吧?

好吧,现在是神秘部分。我假设大多数碰撞都会有方法 #1 和 #2,其中 #1 会稍微快一点,更不会碰撞,最少的碰撞会有方法 #4 和 #5,其中 #4 会稍微快一点,更不会碰撞,方法 # 3 将是某种妥协。

所以我做了一个测试来证明我的假设。我使用每种提到的方法生成了 10 倍(使其平均)一百万个随机数,并计算了生成一百万个数字所需的平均碰撞次数和平均时间。结果(如下)让我有点吃惊。

results:duration格式为小时:分钟:秒:毫秒

Method1: AvgCollisions: 235, AvgDuration: 00:00:00.3561967
Method2: AvgCollisions: 116, AvgDuration: 00:00:00.4042033
Method3: AvgCollisions: 115, AvgDuration: 00:00:04.6037259
Method4: AvgCollisions: 234, AvgDuration: 00:00:09.2195856
Method5: AvgCollisions: 233, AvgDuration: 00:00:09.1788223

我又跑了几次测试,结果总是差不多。

你不觉得奇怪吗?我假设的时间一点也不意外,但结果对我来说意味着,方法 2 是生成随机数的最佳方法,因为它是最随机、最快的,并且您可以设置最小和最大生成数.不知道 Method2 比 Method3 更可预测多少,因为我不知道我将如何测试它。

有人可以向我解释我做错了什么,或者为什么方法 #4 和 #5 没有最少的碰撞,为什么碰撞的百分比总是相同?不应该是随机的吗?

编辑:这是我完成的此测试的 Visual Studio 2010 解决方案:http://bit.ly/nxLODw

最佳答案

唯一奇怪的行为是方法 5。

在方法 1、4 中,您生成一个 0 到 int.MaxValue 范围内的数字。

在方法 2、3 和 5 中,您生成一个 int.MinValue 到 int.MaxValue 范围内的数字。

因此,对于方法 2 和 3,您的范围大约是方法 1 和 4 的两倍,并且与方法 1 和 4 相比,它们的碰撞大约减少一半。这对我来说似乎很正常。

那么为什么方法 5 会产生与方法 1 和 4 一样多的碰撞,即使它产生的数字范围更大?好吧,事实证明 System.Random 构造函数采用种子的绝对值。换句话说,它将随机序列的数量减少到可能的一半。因此,即使您从更大的范围内获得数字,您也可以从更少的不同序列中生成它们。

关于C# 生成随机 int - 神秘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7772621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com