Random如果我这样做,我在Javas 课上遇到麻烦:
Random rng = new Random(seed) // seed == 29 in this example
String ss = "";
        for(int i = 0; i < 10; i++)
        {
            int s = rng.nextInt();
            ss += Integer.toString(s);
            ss +="\n";
        }
这就是我得到的回报:
-1169335537
-2076183625
1478047223
1914482305
722089687
2094672350
-1234724057
-1614953544
-321574001
1000360613
从我所看到的,这应该只是回到正数开始?
这可能有点牵强,但它与在Windows 7 64位上运行64位机器无关?
任何帮助都是非常需要今天完成任务的完成!
Ted*_*opp 61
所有2 32个 可能的int值以(近似)相等的概率产生.
一种方法是使用以下转换:
s =  rng.nextInt() & Integer.MAX_VALUE; // zero out the sign bit
需要这样的东西(与使用绝对值或否定相反)是Integer.MIN_VALUE绝对值太大而不能变成正整数.也就是说,由于溢出,Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE和Integer.MIN_VALUE == -Integer.MIN_VALUE.上面的转换保留了近似均匀的分布属性:如果你写了一个刚刚丢弃的生成和测试循环Integer.MIN_VALUE并返回其他所有的绝对值,那么正整数将是零的两倍.通过映射Integer.MIN_VALUE到零,可以使零概率与正整数成一致.
这是另一种方法,实际上可能更快一点(虽然我没有对它进行基准测试):
int s = rng.next(Integer.SIZE - 1); // Integer.SIZE == 32
这将产生具有31随机低位的整数(和0作为32 次位,保证一个非负的值).但是(正如jjb的注释中指出的那样),因为next(int)是一个protected方法Random,你必须子类Random来公开方法(或者为方法提供合适的代理):
public class MyRandom extends Random {
    public MyRandom() {}
    public MyRandom(int seed) { super(seed); }
    public int nextNonNegative() {
        return next(Integer.SIZE - 1);
    }
}
另一种方法是使用ByteBuffer包装4字节数组的方法.然后,您可以生成一个随机的四个字节(通过调用nextBytes(byte[])),将符号位置零,然后将该值读取为int.我不相信这提供了超过上述任何优势,但我想我会把它扔出去.它与我的第一个解决方案基本相同(掩盖了Integer.MAX_VALUE).
在这个答案的早期版本中,我建议使用:
int s = rng.nextInt(Integer.MAX_VALUE);
但是,根据文档,这将生成0(包括)到Integer.MAX_VALUE(不包括)范围内的整数.换句话说,它不会产生价值Integer.MAX_VALUE.另外,事实证明next(int)总是比它更快nextInt(int).
kai*_*ong 13
由于正数或负数的概率相等,为什么不只是:
Math.abs(rand.nextInt())
好,易于!