我想为数学问题生成伪随机位。位大小是用户馈送的。但与正常问题不同的是,这里有一点点扭曲。如果位以0开头并且字面上与用户输入的大小匹配,则数学问题也给出有效结果。 示例:对于用户输入4,以下所有内容均为有效输出:
-> 0000
-> 0001
-> 1000
-> 0100
等。 我现在使用此函数生成数字:
int randomChoice = choice.Next(1 << (input - 1), (1 << input) - 1);
bitSize = randomChoice;
是否有任何其他随机位生成方式可以从0开始,只要它遵循C#中的文字位长度而不进行复杂的数组操作?
答案 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);