【问题标题】:Advanced Pseudo Random Bit Generation高级伪随机位生成
【发布时间】:2012-12-26 23:33:05
【问题描述】:

我想为一个数学问题生成伪随机位。位大小由用户提供。但与正常问题不同的是,这里有一个小转折。如果位以 0 开头并且字面上与用户输入的大小匹配,则数学问题也会给出有效的结果。 示例:对于用户输入 4,以下所有内容均为有效输出:

-> 0000
-> 0001
-> 1000
-> 0100

等等。 我现在正在使用这个函数来生成数字:

int randomChoice = choice.Next(1 << (input - 1), (1 << input) - 1);
bitSize = randomChoice;

是否有任何其他的随机位生成方式可以以 0 开头,只要它遵循 C# 中的字面位长度而不涉及复杂的数组操作?

【问题讨论】:

  • 嘿@Jeet.Deir - 很高兴再次见到你!你给出的例子,这不是真正的 input = 4 - 是吗?!你能验证那部分吗?
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 1
  • @Miky Dinescu 也很高兴见到你 :) 这是用于读取 Miky 的输入值。我知道您的代码与我用 if-elses 编写的代码完全同步,但是我在问题中发布的前面的 0 是否可能?谢谢。
  • @John Saunders 再次抱歉。坏习惯 :( .

标签: c# random


【解决方案1】:

下面一行:

int randomChoice = choice.Next(1 << (input - 1), (1 << input) - 1)

对于input = 4 等价于:

int randomChoice = choice.Next(8, 15);

这将per MSDN documentation 选择以下值之一:8、9、10、11、12、13、14 - 随机。请注意,值 15 不会被选择,因为文档明确指出下限 (8) 是 )inclusive_ 而上限 (15) 是 exclusive。 p>

这些二进制值是:

8 : 1000
9 : 1001
10: 1010
11: 1011
12: 1100
13: 1101
14: 1110

我相信@Jon Skeet 所说的是您正在生成始终设置 MSB(最左侧位)的随机数。因此错过了所有适合以 0 开头的 4 位的值(未设置 MSB)。

我还要指出,您可能应该在此处包含值 15,因为它也适合 4 位。因此,通过两次修改,代码行应为:

int randomChoice = choice.Next(0, (1 << input));

这将生成从 0 到 15 的所有值,包括 0 到 15:

0 : 0000
1 : 0001
2 : 0010
3 : 0011
    ...
13: 1101
14: 1110
15: 1111

这就是你要找的吗?

【讨论】:

  • 没错。有没有办法用 0 填充左边的空白位,这样我就可以通过(比如输入 = 4 和随机数 = 2)0010 而不是 10?这就是我要问的。再次感谢米基。
  • 10 与 0010 相同(二进制) - 就像 2 与以 10 为底的 0002 相同。如果您想通过在数字小于时预置 0 来格式化字符串4 大小,然后您可以使用 String.Format 函数。查一下;)
  • 这样做了:string binary = Convert.ToString(bitSize, 2); if (input &gt;= 0 &amp;&amp; input &lt;= 16) { binary = binary.PadLeft(input, '0'); } else { Console.WriteLine("Invalid Input"); }
【解决方案2】:

在您上一个问题中,您接受了一个改进了原始代码的答案。问题是,你的代码一开始就错了。你只想要一个 single 随机位。你需要这样做:

   int maxBit = AskUserForMaxBit();
   int randomBit = choice.Next(1, maxBit+1);
   int randomValue = 1 << (randomBit - 1);
   return Convert.ToString(randomValue, 2);

【讨论】:

  • 这使我们两个人,我不明白你不明白。很确定这是您实际要求的。试试看。
猜你喜欢
  • 2015-08-07
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2014-05-18
  • 1970-01-01
  • 2023-01-03
  • 2018-03-20
相关资源
最近更新 更多