gpt4 book ai didi

c# - 随机整数中最可能的位

转载 作者:可可西里 更新时间:2023-11-01 09:05:26 28 4
gpt4 key购买 nike

我做过这样的实验——用 C 和 C# 制作了 1000 万个随机数。然后统计随机整数中15位中的每一位被设置了多少次。 (我选择 15 位是因为 C 只支持最大 0x7fff 的随机整数)。

我得到的是: enter image description here
我有两个问题:

  1. 为什么有 3 个最可能的位?在 C 情况下,位 8,10,12 是最有可能的。和C#6,8,11 最有可能。

  2. 与 C# 最可能位相比,C# 最可能位也似乎大部分 移动了 2 个位置。为什么是这样 ?因为 C# 使用其他 RAND_MAX 常量还是什么?


我的 C 测试代码:

void accumulateResults(int random, int bitSet[15]) {
int i;
int isBitSet;
for (i=0; i < 15; i++) {
isBitSet = ((random & (1<<i)) != 0);
bitSet[i] += isBitSet;
}
}

int main() {
int i;
int bitSet[15] = {0};
int times = 10000000;
srand(0);

for (i=0; i < times; i++) {
accumulateResults(rand(), bitSet);
}

for (i=0; i < 15; i++) {
printf("%d : %d\n", i , bitSet[i]);
}

system("pause");
return 0;
}

C# 的测试代码:

static void accumulateResults(int random, int[] bitSet)
{
int i;
int isBitSet;
for (i = 0; i < 15; i++)
{
isBitSet = ((random & (1 << i)) != 0) ? 1 : 0;
bitSet[i] += isBitSet;
}
}

static void Main(string[] args)
{
int i;
int[] bitSet = new int[15];
int times = 10000000;
Random r = new Random();

for (i = 0; i < times; i++)
{
accumulateResults(r.Next(), bitSet);
}

for (i = 0; i < 15; i++)
{
Console.WriteLine("{0} : {1}", i, bitSet[i]);
}

Console.ReadKey();
}

非常感谢!!顺便说一句,操作系统是 Windows 7、64 位架构和 Visual Studio 2010。

编辑
非常感谢@David Heffernan。我在这里犯了几个错误:

  1. C 和 C# 程序中的种子不同(C 使用零,而 C# - 当前时间)。
  2. 我没有尝试用不同的 Times 变量值进行实验来研究结果的可重复性。

这是我在分析设置第一位的概率如何取决于调用 random() 的次数时得到的结果: enter image description here
正如许多人注意到的那样 - 结果不可重现,不应认真对待。(除了某种形式的确认 C/C# PRNG 足够好 :-))。

最佳答案

这只是常见的或一般的抽样变化。

想象一下您反复抛硬币十次的实验。您不会期望每次都能获得五个正面。这取决于抽样差异。

以同样的方式,您的实验将受到抽样变化的影响。每个位遵循相同的统计分布。但是抽样变化意味着您不会期望 0 和 1 之间精确的 50/50 分割。

现在,您的情节误导您认为变异在某种程度上是重要的或具有意义。如果从 0 开始绘制图表的 Y 轴,您会对此有更好的理解。该图表如下所示:

enter image description here

如果 RNG 正常运行,那么每一位都将遵循 binomial distribution概率为 0.5。此分布具有方差 np(1 − p)。对于您的实验,这给出了 250 万的方差。取平方根得到大约 1,500 的标准偏差。所以你可以简单地从检查你的结果中看出,你看到的变化并没有明显的异常。您有 15 个样本,没有一个与真实均值的标准差超过 1.6 个。这没什么好担心的。

您已尝试辨别结果中的趋势。你说过有“3 个最可能的位”。那只是您对此示例的特定解释。尝试使用不同的 RNG 种子再次运行您的程序,您将得到看起来有点不同的图表。他们仍将具有相同的质量。有些位比其他位设置得更多。但是不会有任何可辨别的模式,当您将它们绘制在包含 0 的图形上时,您会看到水平线。

例如,这是您的 C 程序针对 98723498734 的随机种子输出的内容。

enter image description here

我认为这应该足以说服您进行更多试验。当您这样做时,您会发现没有特殊位受到优待。

关于c# - 随机整数中最可能的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10722910/

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