为什么此代码生成的 a b c 和 d 比所有其他选项略多?
Why does this code generate a b c and d slightly more than all other options?
这个 lab contains the code from this repo 没有别的。以下代码是 运行 从一组小写字母和单个数字中生成一百万个 1 字符随机数。
<?php // Iterate the number of letters needed
for ( $Iterate = 0; $Iterate < $Length; $Iterate++ ) {
$String .= $String_Characters[hexdec(bin2hex(openssl_random_pseudo_bytes(1))) % $String_Characters_Count];
}
如实验室中的图表所示,a、b、c 和 d 比任何其他组合更有可能生成。它们出现在字符串的开头,而不是中途,所以我假设代码比其他代码多生成 1、2、3 和 4。也许这与 %
?
有关
更新
我的解决方案现在是从下面的答案中得出的,使用了一种稍微不同的策略。它失去了自己设置可接受字符的选项,但对于盐来说这并不是什么大问题。可在此处获得:http://labs.eustasy.org/hash-check/generator-check
我现在无法用 php 检查它,但我可以告诉你问题出在 %.
256 % 36 == 4
这意味着前4个数字将有更多的机会被数字生成器输出。具体来说,数组中前 4 项被选中的概率是其他项的 8/7 倍。
另一方面,由于您同时使用字符串和数字作为数组索引,因此数组的实际顺序可能与您输出的顺序不同。我的猜测是,根据结果判断,您首先拥有 a-z 值,然后是 0-9 值,因此当您附加 $String_Characters 中的第 0、1、2 和 3 项时,您实际上是在附加 "a"、"b"、"c" 和 "d" 到字符串。
我不是统计学家,但我会尽力回答。请原谅我可能有错误的词典:)
你是对的,这是关于决赛的事情%
。如果你删除它并绘制分布,它很好,结束几乎均匀分布。所以随机算法不是罪魁祸首。没有模数的分布 space 由 256 个槽组成。如果您缩小 分配到 36 个槽位(字母+数字),您将不得不 映射 一些槽位到一个槽位。
256 % 36 = 4
鉴于这个简单的哈希函数,4 个槽(前四个)将比原始分布 槽 多 1 个槽,这导致图表显示的元素编号更高。
相反,如果您的 $String_Characters
长度为 32 个字符,我希望图表分布均匀。
这个 lab contains the code from this repo 没有别的。以下代码是 运行 从一组小写字母和单个数字中生成一百万个 1 字符随机数。
<?php // Iterate the number of letters needed
for ( $Iterate = 0; $Iterate < $Length; $Iterate++ ) {
$String .= $String_Characters[hexdec(bin2hex(openssl_random_pseudo_bytes(1))) % $String_Characters_Count];
}
如实验室中的图表所示,a、b、c 和 d 比任何其他组合更有可能生成。它们出现在字符串的开头,而不是中途,所以我假设代码比其他代码多生成 1、2、3 和 4。也许这与 %
?
更新
我的解决方案现在是从下面的答案中得出的,使用了一种稍微不同的策略。它失去了自己设置可接受字符的选项,但对于盐来说这并不是什么大问题。可在此处获得:http://labs.eustasy.org/hash-check/generator-check
我现在无法用 php 检查它,但我可以告诉你问题出在 %.
256 % 36 == 4
这意味着前4个数字将有更多的机会被数字生成器输出。具体来说,数组中前 4 项被选中的概率是其他项的 8/7 倍。
另一方面,由于您同时使用字符串和数字作为数组索引,因此数组的实际顺序可能与您输出的顺序不同。我的猜测是,根据结果判断,您首先拥有 a-z 值,然后是 0-9 值,因此当您附加 $String_Characters 中的第 0、1、2 和 3 项时,您实际上是在附加 "a"、"b"、"c" 和 "d" 到字符串。
我不是统计学家,但我会尽力回答。请原谅我可能有错误的词典:)
你是对的,这是关于决赛的事情%
。如果你删除它并绘制分布,它很好,结束几乎均匀分布。所以随机算法不是罪魁祸首。没有模数的分布 space 由 256 个槽组成。如果您缩小 分配到 36 个槽位(字母+数字),您将不得不 映射 一些槽位到一个槽位。
256 % 36 = 4
鉴于这个简单的哈希函数,4 个槽(前四个)将比原始分布 槽 多 1 个槽,这导致图表显示的元素编号更高。
相反,如果您的 $String_Characters
长度为 32 个字符,我希望图表分布均匀。