Java随机给出负数

如果我这样做,我遇到了Javas Random课程的问题:

 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位机器无关?

任何帮助都是非常需要今天完成任务的完成!

来自nextInt()的Java文档 :

所有2 32个可能的int值以(近似)相等的概率产生。

一种方法是使用以下转换:

 s = rng.nextInt() & Integer.MAX_VALUE; // zero out the sign bit 

需要这样的东西(与使用绝对值或否定相反)是因为Integer.MIN_VALUE绝对值太大而无法转换为正整数。 也就是说,由于溢出, Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUEInteger.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)Randomprotected方法,所以你必须子类Random来暴露方法(或者为方法提供合适的代理):

 public class MyRandom extends Random { public MyRandom() {} public MyRandom(int seed) { super(seed); } public int nextNonNegative() { return next(Integer.SIZE - 1); } } 

另一种方法是使用包装4字节数组的ByteBuffer 。 然后,您可以生成一个随机的四个字节(通过调用nextBytes(byte[]) ),将符号位置零,然后将该值作为int读取。 我不相信这提供了超过上述任何优势,但我想我会把它扔出去。 它与我的第一个解决方案(使用Integer.MAX_VALUE掩码)基本相同。

在这个答案的早期版本中,我建议使用:

 int s = rng.nextInt(Integer.MAX_VALUE); 

但是,根据文档,这将生成0(包括)到Integer.MAX_VALUE (不包括)范围内的整数。 换句话说,它不会生成值Integer.MAX_VALUE 。 另外,事实certificatenext(int)总是比nextInt(int)更快。

由于正数或负数的机会均等,为什么不只是:

 Math.abs(rand.nextInt()) 

好,易于!

允许使用负数 – 也许您已经读过类似的Random方法nextInt(int) ,它确实将返回值限制为零或更大。

查看java.util.Random的文档:

http://download.oracle.com/javase/6/docs/api/java/util/Random.html

你想要从0到28获得随机数吗? 如果是这样,您需要使用前面提到的nextInt(int)。 种子与可能的产出范围或其相对可能性无关。

根据文档http://download.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt ():

返回下一个伪随机数,从该随机数生成器的序列中均匀分布的int值。 nextInt的一般契约是伪随机生成并返回一个int值。 所有2 ^ 32个可能的int值以(近似)相等的概率产生。

如果值为负,则乘以-1

您还可以使用Math.random()返回0到1之间的值

如果您碰巧使用可能具有负值的数字,您可以通过将值乘以负值自动使用条件声明将其转换为正值。 您也可以使用相同的方法将正值转换为负值。

示例如下。

 // Turn a negative value into its positive correspondent value. // If the value is already a positive value, nothing will happen to it. int a = -5; a = a < 0? a * -1 : a; // Turn a positive value into its negative correspondent value. // If the value is already a negative value, nothing will happen to it. int b = 5; b = b > 0? b * -1 : b; 
 int s = rng.nextInt(seed); //seed 29 in this case 

这将具有029的界限。