【问题标题】:Split random integer into 4 random bytes [closed]将随机整数拆分为 4 个随机字节 [关闭]
【发布时间】:2014-06-03 10:32:45
【问题描述】:

您能否将一个随机无符号整数拆分为 4 个随机无符号字节,以使它们的值 (0-255) 均匀分布?如果有,怎么做?

我在 C# 中尝试过,但似乎 0 的使用频率高于其他数字。

byte[] bytes = BitConverter.GetBytes(u);

好像是这样的:

byte[] array = new byte[4];
fixed (byte* ptr = array)
{
    *(int*)ptr = value;
}
return array;

以下是一些随机整数: http://pastebin.com/sDWBqKJK

【问题讨论】:

  • 如果您的分布不正确,那可能是您生成整数的方式存在问题。
  • 无符号整数由第三方提供,至少应该是均匀分布的。
  • 似乎有什么问题?
  • @AgentFire:大约 245/255 个字节是 0 而不是 1/255
  • 刚刚在您提供的示例数据上运行s.Split(new[]{'\r'}).Select(uint.Parse).SelectMany(BitConverter.GetBytes)。它没有输出很多零。

标签: c# .net random


【解决方案1】:

如果u 仅包含随机位,包括最高有效位或字节,那么您的代码将按原样工作。在 CLR 上,uint 正好有 4 个字节,每个字节长 8 位。这将起作用。

它不起作用,因此您的随机数来源有问题。以十六进制格式 (ToString("X8")) 将其中的 100 个打印到控制台。您可能会看到零比应有的要多得多。

修复随机数的来源。

【讨论】:

  • actually they seem not to have that many zeros: B533B3B9 885BC79E 3D20169E 250D69E6 DA57ECBC 8ACA5BE9 8D90869E 67EFDD63 2AF7D7F3 045D0E57 2415A5D3 AADEAA9E DEB242DA 4C737AA0 20F3C250 E408B658 2DA7E619 3D84634F EF66EF25 4A15B7A6
  • 我也无法发现这些数字有任何问题。 u 的类型是 uintint,对吧?尝试BitConverter.GetBytes((uint)u) 100% 确定。如果这不能帮助您解释GetBytes 的输出,则可能是错误的。这将起作用,这种方法不是错误的。你怎么数零?尝试打印到控制台BitConverter.GetBytes((uint)u)[0]。应该看起来不错。也试试其他索引。
  • 你是对的,现在字节看起来很好。那我一定是在另一个地方出错了!
  • @clamp 很高兴我能帮助你。将此视为调试中的经验教训。我们没有盯着代码等待发现,而是积极调查并验证了系统的所有组件。
猜你喜欢
  • 2018-10-28
  • 1970-01-01
  • 2013-01-13
  • 2013-05-22
  • 2014-09-11
  • 2014-03-11
  • 2013-12-29
  • 2018-11-16
  • 2019-01-05
相关资源
最近更新 更多