4

在第一次迭代中-我想从 0..10 创建一个随机数

这就是我实现它的方式-

 int generator= (int)(Math.random() * (10));

在第一次迭代中,我想创建另一个随机数,但没有其中一个值。例如我想要没有数字 4 的随机数。只有 1,2,3,5,6,7,8,9,0

生成随机数时,如何从数字 0..10 中删除其中一个值?

4

7 回答 7

5

第一种方式: -

您还可以维护一个List所有的数字。然后使用Collections.shuffle打乱列表并获取第一个元素。并删除它。

    List<Integer> list = new ArrayList<Integer>();

    list.add(1); 
    list.add(4);
    list.add(2);
    list.add(3);
    System.out.println("Original List: " + list);

    Collections.shuffle(list);

    System.out.println("Shuffled List: " + list);
    int number1 = list.remove(0);  // Remove the first value
    System.out.println("Number removed: " + number1);

    Collections.shuffle(list);

    System.out.println("Shuffled List: " + list);
    number1 = list.remove(0);
    System.out.println("Number removed: " + number1);

输出: -

Original List: [1, 4, 2, 3]
Shuffled List: [4, 3, 1, 2]
Number removed: 4
Shuffled List: [1, 3, 2]
Number removed: 1

第二种方式: -

更好的方法是从列表0的 到生成一个随机数size,并获取 的值that index并将其删除。

int size = list.size();
Random random = new Random();

for (int i = 0; i < size; i++) {    
    int index = random.nextInt(list.size());
    int number1 = list.remove(index);
    System.out.println(number1);
}

注意: - 如果您想排除一组固定数字的生成,那么您可以将这些数字放在一个列表中。然后从您的list of numbers. 然后使用上述任何一种方法。

于 2012-10-30T18:54:30.723 回答
1

Random.nextInt(10)==number再次生成

public int generateExcept(int number) {
    Random random = new Random();

    int generated = 0;
    while ((generated = random.nextInt(11)) == number) {
    }
    return generated;
}

正如OP所引用的

在第一次迭代中,我想创建另一个随机数,但没有其中一个值

如果我理解正确这是单个操作而不是重复操作。

没有再生

public static int generateExcept(int number, int max) {
    Random random = new Random();
    int generated = 0;
    if ((generated = random.nextInt(max - 1)) == number) {
        generated++;
    }
    return generated;
}

总是生成随机数,max-1因为我们想加一

于 2012-10-30T18:53:44.653 回答
1
int generator= (int)(Math.random() * (10));
if (generator >= 4) generator++;

这将包括数字 10 作为可能的结果,如果您不想这样做,请乘以 9 而不是 10。

于 2012-10-30T18:53:59.853 回答
1

您可以将值存储在列表中,并生成一个随机索引以从该列表中获取。

private Random random = new Random();
private ArrayList<Integer> values = new ArrayList<Integer>();

public static int nextInt() {
    if (values.size() > 0) {
        return values.remove(random.nextInt(values.size()));
    } else {
        throw new RuntimeException("no values possible");
    }
}
于 2012-10-30T18:54:10.290 回答
1

有两种基本的有效方法:

1 - 生成一个有效值数组(0 到 10,4 除外),并使用随机发生器在该数组上选择一个索引。一个例子如下:

Random random = new Random();
int[] unwanted = {4};
int[] values = new int[10-unwanted.length];
for(int i=0; i<10-unwanted.length; i++){
  for(int curr : unwanted){
    if(i == curr) continue;
  }
  values[i] = i;
}
int result = values[random.nextInt(10-unwanted.length)];

2 - 遵循西蒙安德烈的方法

于 2012-10-30T19:01:32.350 回答
0
int excluded[] = { 1,4,3};
Random r = new Random();
int generator;
do {
    generator= r.nextInt(10);
} while (! Arrays.asList(excluded).contains(generator) )
于 2012-10-30T18:51:38.853 回答
0

您可以做的(也许有一种更简洁的处理方式)是检查第二个生成的数字是否与第一个匹配,如果匹配,则让它运行随机数。再次生成器。一个简单的 if...else 循环应该可以解决它。

于 2012-10-30T18:52:04.777 回答