我正在尝试开发Tic Tac Toe游戏,其中玩家1将点击一个按钮放置“X”,然后玩家2(计算机)将在第一步随机地将“O”放入其他按钮。为此我需要创建除了玩家1点击的随机数之外的0到8之间的随机数。
我使用以下代码生成随机数
Random random=new Random();
int number=random.nextInt(9);
答案 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;
}
有许多类似的方法可以做到这一点。我想这会给你一个完全随机的选择。