0

我现在正在做一个项目,我有点棘手。我正在尝试生成八个连续的随机数,但有一个问题。一个和另一个之间的值不得超过五,并且数字不得重复。例如:

5 5 3 12 would need to be: 5 (Something else) 3 (Something else)

我一直在使用 Random() 选项来回运行,但似乎无法使其正常工作。所以我决定预先确定整数,以便随机数必须在它们之间进行选择。

int One = 1, Two = 3, Three = 5, Four = 7, Five = 8;
Random RNumber = new Random();
int RInteger = RNumber.nextInt(One, Two, Three, Four, Five);

是的,你可能知道......它不起作用。现在我只是 Java 的初学者,所以我想请教您一些建议。或者让我知道我是否正确地处理了这个问题。提前致谢,祝您有美好的一天。

如果你有兴趣。错误:

No suitable method found for nextInt(int, int, int, int, int)
method Random.nextInt(int) is not applicable
4

6 回答 6

5

我会使用像这样的循环

public static List<Integer> generate(int count, int maxDiff, int min, int max) {
    Set<Integer> ret = new LinkedHashSet<Integer>();
    Random rand = new Random();
    int last = rand.nextInt(max - min + 1) + min;
    ret.add(last);
    while(ret.size() < count) {
        int next = rand.nextInt(max - min + 1) + min;
        if (Math.abs(next - last) <= maxDiff) {
            ret.add(next); // will ignore duplicates
            last = next;
        }
    }
    return new ArrayList<Integer>(ret);
}
于 2013-06-11T11:59:04.373 回答
2

如果要从定义的整数列表中获取随机整数,则将其Integers放入 a中List,然后使用Collections.shuffle方法对其进行洗牌。获取列表的第一项,然后从列表中删除您获取的最后一个数字并重复该过程。

使用我所说的并检查数字最大差异的示例代码是 5:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class RandomNumbers {

    public static int OFFSET = 5;

    public static void main(String[] s){
        RandomNumbers rn = new RandomNumbers();
        int prev = 20; //Set prev randomly or any way you want to initialize the list
        for (int i = 0; i < 10; i++){
            prev = rn.getRandomWithinOffset(prev);
            System.out.println(prev);
        }
    }

    private int getRandomWithinOffset (int prev){
        List<Integer> listNumbers = new ArrayList<Integer>();
        for (int i = prev -OFFSET; i < prev + OFFSET; i++){
            listNumbers.add(i);
        }
        listNumbers.remove(new Integer(prev));
        Collections.shuffle(listNumbers);
        return listNumbers.get(0);
    }

}
于 2013-06-11T11:56:12.127 回答
1

制作自己的功能:

public generatePseudoRandom(int currentInt) {
    Random random= new Random();
    Integer result= null;
    while (result == null || result.intValue() < currentInt - 5 || result.intValue() > currentInt + 5 || result.intValue() == currentInt) {
        result = random.nextInt(current + 5);
    } 
    return result;
}

它将生成新的数字,直到它在您的五个边界内。

于 2013-06-11T11:56:26.593 回答
0

在我看来,这只是在 -5 和 5 之间生成一个随机数并将其添加到列表中的最后一个数字的问题。只需确保数字不为 0,这样最后一个数字就不会重复。

伪代码:

Let n = random number
output n
repeat {
  repeat {
    Let r = random number between -5 and 5
  } until (r != 0)
  next_n = n + r
  output next_n
  n = next_n
} until (enough numbers are output)
于 2013-06-15T17:35:32.097 回答
0

NextInt 接受您需要的最大数量。例如数字 0-20。nextInt(20) (这只会给出 0-20 的随机数。你不能做多个数字。

要执行您需要的操作,请创建一个整数数组(5、10、20 等)...然后执行 nextInt(array.size())。这将为您提供一个随机数的索引。然后从该索引中获取数字。

Arraylist<Integer> randomNumbers = new Arraylist<Integer>();
randomNumbers.add(5);
randomNumbers.add(10);
randomNumbers.add(15);

Random gen = new Random();
int index = gen.nextInt(randomNumbers.size());

int randomInt = randomNumbers.get(index);
于 2013-06-11T11:55:58.583 回答
0

再次向大家问好。我一直在研究您的回复,发现它们非常有趣且很有帮助。但是,我确实提到我刚刚开始编程,所以我有点难以理解它们是如何工作的。鉴于此,我决定尝试创建自己的版本。这就是我想出的。

import java.util.Random;

public class Main
{
    public static void main(String[] args)
    {
        int RInteger, Loop1 = 0, Loop2 = 0, Loop3 = 0;
        Random RNumber = new Random();
        while (Loop1 == 0) //Generate the first number
        {
            RInteger = RNumber.nextInt(8);
            if (RInteger == 1)
            {
                Loop1 = 1;
            }
            if (RInteger == 5)
            {
                Loop1 = 5;
            }
            if (RInteger == 7)
            {
                Loop1 = 7;
            }
        }
        while (Loop2 == 0) //Generates the second number making sure no duplicates are present and the maximum difference of 5
        {
            RInteger = RNumber.nextInt(8);
            if (RInteger == 1 && (RInteger != Loop1) && (RInteger - Loop1) <= 5 && (RInteger - Loop1) >= -5)
            {
                Loop2 = 1;
            }
            if (RInteger == 5 && (RInteger != Loop1) && (RInteger - Loop1) <= 5 && (RInteger - Loop1) >= -5)
            {
                Loop2 = 5;
            }
            if (RInteger == 7 && (RInteger != Loop1) && (RInteger - Loop1) <= 5 && (RInteger - Loop1) >= -5)
            {
                Loop2 = 7;
            }
        }
        while (Loop3 == 0) //A repeat of Loop2 with changed Loop1s into Loop2s and Loop2s into Loop3s
        {
            RInteger = RNumber.nextInt(8);
            if (RInteger == 1 && (RInteger != Loop2) && (RInteger - Loop2) <= 5 && (RInteger - Loop2) >= -5)
            {
                Loop3 = 1;
            }
            if (RInteger == 5 && (RInteger != Loop2) && (RInteger - Loop2) <= 5 && (RInteger - Loop2) >= -5)
            {
                Loop3 = 5;
            }
            if (RInteger == 7 && (RInteger != Loop2) && (RInteger - Loop2) <= 5 && (RInteger - Loop2) >= -5)
            {
                Loop3 = 7;
            }
        }
        System.out.println(Loop1 + " " + Loop2 + " " + Loop3);
    }
}

它功能齐全,但效率很低。如果要添加更多的数字,则还应分别实现相应的 if。每个额外数字还有另一个循环。

我希望这对某人有所帮助。再次感谢您的所有回复。

祝你有美好的一天。

于 2013-06-11T19:52:29.673 回答