Java - 从已定义的整数中随机选择

时间:2013-06-11 11:52:28

标签: java algorithm random

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

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

我一直在使用Random()选项来回运行,但似乎无法使其工作。所以我决定预先确定整数,以便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

6 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

如果要从定义的整数列表中获取随机整数,请将Integers放在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);
    }

}

答案 2 :(得分: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;
}

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

答案 3 :(得分: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);

答案 4 :(得分: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);
    }
}

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

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

度过美好的一天。

答案 5 :(得分: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)