高级伪随机比特生成

时间:2012-12-25 20:05:54

标签: c# random

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

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

等。 我现在使用此函数生成数字:

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

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

2 个答案:

答案 0 :(得分:2)

以下一行:

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)是包含_而上限(15)是独占

二进制中的那些值是:

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

我相信@Jon Skeet所说的是你生成的随机数总是有MSB(最左边的位)。因此错过了所有适合4位的值,这些值以0开头(未设置MSB)。

我还要指出,你应该在这里包含值15,因为它也适合4位。因此,通过这两个修改,代码行应为:

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

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

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

这就是你要找的东西吗?

答案 1 :(得分:2)

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

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