如何生成0-8范围内的随机数,除了一个特定的数字?

时间:2014-03-02 14:08:12

标签: java

我正在尝试开发Tic Tac Toe游戏,其中玩家1将点击一个按钮放置“X”,然后玩家2(计算机)将在第一步随机地将“O”放入其他按钮。为此我需要创建除了玩家1点击的随机数之外的0到8之间的随机数。

我使用以下代码生成随机数

Random random=new Random();
int number=random.nextInt(9);

8 个答案:

答案 0 :(得分:4)

如果你想要从0到8的随机数,其中一个值被排除,那么实际上有8个可能的值,而不是9.因此生成一个从0到7的随机数 - random.nextInt(8) - 如果结果更大超过或等于您的排除值,添加1。

答案 1 :(得分:1)

我预先生成随机数列表,然后从中分配。 e.g。

// Initialize the list:
List<Integer> numbers;

public void init() {
    numbers = new LinkedList<Integer>(9);
    for (int i = 0; i < 9; ++i) { 
        numbers.add(i);
    }
}

public int nextSelectNumber() {
    int index = random.nextInt (numbers.size());
    return numbers.get(index);
}

答案 2 :(得分:1)

除了玩家选择的最后一个,你不需要0到8之间的随机数,你需要一个随机数来自你拥有的选项。这可能会有所不同,因为人类和计算机将选择不同的(随机?)数字。这并不像其他人已经回答的那么容易。一个选项可能是使用List<Integer>作为保存当前选项的作业。基于@Mureinik's answer中提供的代码:

class TicTacToeCells {
    private static final int MAX_CELLS = 9;
    private List<Integer> cells;
    private Random random;

    public void init() {
        random = new Random();
        cells = new ArrayList<Integer>(MAX_CELLS);
        for (int i = 0; i < MAX_CELLS; ++i) { 
            numbers.add(i);
        }
    }

    //for human moves
    public boolean canPickCell(int cellToPick) {
        return cells.contains(cellToPick);
    }

    public int pickCellByComputer() {
        int index = random.nextInt(cells.size());
        return cells.get(index);
    }

    public void pickCell(int cellToPick) {
        cells.remove(cellToPick);
        //further logic to display the move or something else...
    }
}

答案 3 :(得分:1)

执行nextint(availableSpaces)并将结果作为序数,即3表示第三个可用位置

答案 4 :(得分:1)

您最终需要担心移除多个位置,因此最好跟踪可用位置的集合。 一些可能的解决方案的伪代码:

//when you first run the game
List<Integer> availablePositions = new ArrayList<Integer>();
for (int i =0; i<boardSize; i++)
   availablePositions.add(i);

//when you click on a board
availablePositions.remove(myPosition)

//when you have the computer pick a position
Random rand = new Random();
int  n = rand.nextInt(availablePositions.size());   //gets a number between 0 and remaining number of positions

int pickedPosition = availablePositions.get(pickedPosition); //get computer's position
availablePositions.remove(pickedPosition);  //remove computer's position from available options

答案 5 :(得分:0)

您可以使用以下内容:

    int alreadyPickedNumber=3 //Number to exclude
    int number=random.nextInt(9);
    while(number==alreadyPickedNumber){
         number=random.nextInt(9);
    }

答案 6 :(得分:0)

跟踪已生成的数字。例如:

@ThreadSafe
public final class TicTacToeNumberChooser
{
    private final Random random = new Random();
    // Default initialization value for boolean arrays is false
    private final boolean[] picked = new boolean[9];
    private int nrPicked = 0;

    public synchronized int randomPick()
    {
        if (nrPicked == 9)
            throw new IllegalStateException();

        int ret;
        while (true) {
            ret = random.nextInt(9);
            if (picked[ret])
                continue;
        }
        picked[ret] = true;
        nrPicked++;
        return ret;
    }

    public synchronized boolean isPicked(final int number)
    {
        return picked[number];
    }

    public synchronized void doPick(final int number)
    {
        if (picked[number])
            throw new IllegalStateException();
        picked[number] = true;
        nrPicked++;
    }
}

答案 7 :(得分:0)

让数字为0-8,&#34;设置使用&#34;已使用数字。然后选择0到(8-used.size())范围内的数字,然后遍历set以查找该索引处的数字。

int get_random_int(set<int>& used) {
    int no_of_numbers = 8 - used.size();     
    int index = rand() % no_of_numbers;
    int target = 0;
    for (int i = 0; i <= index;) {
         if (used.find(target) == used.end()) i++;
         target++;
    }
    return target;
}

有许多类似的方法可以做到这一点。我想这会给你一个完全随机的选择。