1

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

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

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

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

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

4

2 回答 2

2

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

   int maxBit = AskUserForMaxBit();
   int randomBit = choice.Next(1, maxBit+1);
   int randomValue = 1 << (randomBit - 1);
   return Convert.ToString(randomValue, 2);
于 2012-12-25T21:18:44.813 回答
2

以下行:

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

forinput = 4等价于:

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

根据 MSDN 文档,它将选择以下值之一: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(最左侧位)的随机数。因此错过了所有适合以 0 开头的 4 位的值(未设置 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

那是你要找的吗?

于 2012-12-25T20:31:00.400 回答