Java 除了一个特定的数字外,如何生成0-8范围内的随机数?
我正在尝试开发一款Tic Tac Toe游戏,玩家1会点击一个按钮来放置“X”,之后玩家2(计算机)会在第一步随机将“O”放置到其他按钮上。为此,我需要创建一个0-8之间的随机数,除了玩家1点击的那个 我使用下面的代码生成随机数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=
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