我正在实现一堆不同类型的伪随机数生成器来玩。我注意到线性同余生成器的周期可以是int的大小,并且我认为我可以使用溢出而不是模数,看看它是否更快。
唯一的障碍是溢出溢出到符号位,我需要它们都是正值。
编辑:我在几个概念上多云,所以我正在清理这个问题,所以它更有意义。 基本上这一切归结为我试图砍掉一个整数的符号位。我发现用int.MinValue对数字进行异或操作就可以了。但只有当它已经溢出时,如果它没有相反的情况。我想避免使用额外的if语句。如果有人可以向我展示一些巧妙的技巧来阻止前31位并将它们填充为整数,那将是令人愉快的。或者将符号位设置为零的某种方式可能更好?
答案 0 :(得分:3)
如果你希望溢出从零开始,你应该屏蔽掉符号位。
unchecked {
int x = int.MaxValue + 5;
int y = x & 0x7fffffff;
}
Console.WriteLine(y);
输出数字4。
我不认为溢出值的绝对值会给你你想要的东西(你会上升到maxint,然后下降,加上,你必须专门处理int.MaxValue + 1,因为它equals int.MinValue,Math.Abs()将抛出异常。
unchecked {
int x = int.MaxValue + 5;
int y = Math.Abs(x);
}
Console.WriteLine(y);
输出数字2147483644。
答案 1 :(得分:0)
你的意思是:
int x = -100;
int mask = (x >> 31);
Trace.WriteLine((x + mask) ^ mask);
output: 100