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

Java 除了一个特定的数字外,如何生成0-8范围内的随机数?,java,Java,我正在尝试开发一款Tic Tac Toe游戏,玩家1会点击一个按钮来放置“X”,之后玩家2(计算机)会在第一步随机将“O”放置到其他按钮上。为此,我需要创建一个0-8之间的随机数,除了玩家1点击的那个 我使用下面的代码生成随机数 Random random=new Random(); int number=random.nextInt(9); 您可以使用以下选项: int alreadyPickedNumber=3 //Number to exclude int number=

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

我使用下面的代码生成随机数

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

您可以使用以下选项:

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

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

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

//初始化列表:
清单编号;
公共void init(){
数字=新的链接列表(9);
对于(int i=0;i<9;++i){
增加(i);
}
}
public int nextSelectNumber(){
int index=random.nextInt(numbers.size());
返回数字。获取(索引);
}

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

@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++;
    }
}

除了玩家选择的最后一个之外,你不需要一个介于0和8之间的随机隆隆声,你需要从你的选项列表中选择一个随机数。这可能会有所不同,因为人类和计算机会选择不同的(随机?)数字。这并不像其他人已经回答的那么容易。对于保存当前选项以供选择的作业,可以使用
列表
。根据中提供的代码:

类细胞{
专用静态最终int MAX_单元=9;
私有列表单元;
私有随机;
公共void init(){
随机=新随机();
单元=新阵列列表(最大单元数);
对于(int i=0;i
执行nextint(availableSpaces)并将该结果作为序号,即3表示第三个可用位置

让数字为0-8,“设置已使用”中使用了数字。然后选择范围为0到(8-used.size())的数字,然后遍历集合以查找该索引处的数字

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;
}
int get\u random\u int(设置和使用){
int no_of_numbers=8-used.size();
int index=rand()%n个数中没有一个;
int目标=0;

对于(inti=0;i您最终需要担心删除多个位置,因此最好跟踪可用位置的集合。 可能的解决方案的一些伪代码:

//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
//第一次运行游戏时
List availablePositions=new ArrayList();

for(int i=0;iHint:跟踪先前生成的数字)。您对值的分布有什么期望吗?随机数提供程序是否需要线程安全?
我需要创建一个0-8之间的随机数,除了玩家1单击的随机数之外
实际上,您需要避免用户和计算机单击的所有数字,您需要像一个数组一样跟踪所有占用的位置,并生成一个适合剩余位置的数字OP明确表示“0到8”@fge:这个答案包含了这一点。或者更好的方法是,使用一个
列表
,它包含了你可以选择的数字,正如我在回答中所指出的。好吧,当然,但是对于这个问题,
列表
在我看来有些过分了……嗯,这是一个品味问题,我想guess@fge不,该列表保存了您仍然可以选择的选项。这就是为什么在
pickCell
中删除op从列表中删除注释。是,抱歉。正在删除注释。
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;
}
//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