4

我正在尝试使用,创建一个随机数生成器java.util.Random。我需要生成 -5 和 +5 之间的数字,不包括零。这是我的一个实验室的弹跳盒应用程序。随机数是盒子的速度方向。

Random v = new Random();
       int deltaX = -5 + v.nextInt(10)  ;
       for(; deltaX>0 && deltaX<0;){

           System.out.println(deltaX);
       }

我试过这个,但它不排除零。任何帮助,将不胜感激。

4

7 回答 7

5

这是一种方法:

int deltaX = -5 + v.nextInt(10);
if (deltaX >= 0) deltaX++;
于 2013-10-20T18:34:41.600 回答
4

还有一种方式:

int[] outcomeSet = {-5, -4, -3, -2, -1, 1, 2, 3, 4, 5};
int deltaX = outcomeSet[v.nextInt(10)];

如果将其outcomeSet设为静态,则这应该是计算效率最高的。

于 2013-10-20T20:28:30.603 回答
3

每次不重新生成随机数的一种可能解决方案是使用以下算法:

public int getRandomWithExclusion(Random rnd, int start, int end, int... exclude) {
    int random = start + rnd.nextInt(end - start + 1 - exclude.length);
    for (int ex : exclude) {
        if (random < ex) {
            break;
        }
        random++;
    }
    return random;
}

可以使用数组引用调用以下内容:

int[] ex = { 2, 5, 6 };
val = getRandomWithExclusion(rnd, 1, 10, ex)

或直接将号码插入通话中:

val = getRandomWithExclusion(rnd, 1, 10, 2, 5, 6)

它会在开始和结束(包括)之间生成一个随机数 (int),并且不会为您提供包含在数组 exclude 中的任何数字。所有其他数字都以相同的概率出现。请注意,必须满足以下约束条件:排除按升序排序,并且所有数字都在提供的范围内,并且它们都是相互不同的。

于 2013-10-20T18:48:09.633 回答
2

我喜欢在 [-5,4] 范围内随机的其他答案,如果值为 0 或更大,它们会添加 1 以形成真实范围[-5; -1] [1; 5]

但这里有一些更简单的方法,虽然不是更短。

Random v = new Random();

boolean makeNegative = v.nextBoolean();
int value = v.nextInt(5) + 1; // range [1; 5]

if (makeNegative)
    value = -value;

它的效率较低,因为它需要两个随机值(布尔值和整数),但代码更易于阅读。

于 2013-10-20T18:48:19.827 回答
1

你可以这样尝试:-

int deltaX = -5 + v.nextInt(10); 
if (deltax >= 0) deltax++;
于 2013-10-20T18:35:13.587 回答
1
do {
  deltaX = -5 + v.nextInt(11);
} while (deltaX == 0)

最简单的方法,仍然是随机的(不 +1)。

于 2013-10-20T18:38:48.107 回答
1

你也可以这样做:

Random random = new Random();
int random = random.nextInt(5) + 1;
int result = random.nextBoolean() ? random : -random;

是的,它的效率较低,因为它需要两个随机值。结果区间为 [-5 - 0) 和 [1 - 5]

于 2013-10-20T18:47:57.593 回答