在每个数字只能生成一定次数的约束下,生成范围(0-4)内的随机数



我需要生成随机数作为一个名为randomize的函数的输出。我正在尝试生成0到4之间的数字。然而,

  • 0生成2次后,停止生成0,blankCount计数0代
  • 一旦1生成4次,停止生成1,birdCount计数1代
  • 一旦生成1次2,停止生成2,specialCount计数2代
  • 一旦3生成2次,停止生成3,nullCount计数3次
  • 一旦生成4 1次,停止生成4,crashCount计数4代

我正在将数组中的一个位置设置为此函数的输出。功能在帖子的末尾。问题是让函数停止调用自己。我得到一个堆栈溢出错误与此代码。

目标是拥有两个0、四个1、一个2、两个3和一个4

0,0,1,1,1,2,3,4

有人能帮助实现此功能吗?

int blankCount = 0;
int birdCount = 0;
int specialCount = 0;
int nullCount = 0;
int crashCount = 0;
int randomize(){
int num = 0;
int randomNum = floor(random(0,5));

if(randomNum == 0 && blankCount <= 1) {
blankCount++;
num = randomNum;
}else if(randomNum == 0 && blankCount == 2){
num = randomize();
}else if(randomNum == 1 && birdCount <= 3){
birdCount++;
num = randomNum;
}else if(randomNum == 1 && birdCount == 4){
num = randomize();
}else if(randomNum == 2 && specialCount <= 0){
specialCount++;
num = randomNum;
}else if(randomNum == 2 && specialCount == 1){
num = randomize();
}else if(randomNum == 3 && nullCount <= 1){
nullCount++;
num = randomNum;
}else if(randomNum == 3 && nullCount == 2){
num = randomize();
}else if(randomNum == 4 && crashCount <= 0){
crashCount++;
num = randomNum;
}else if(randomNum == 4 && crashCount == 1){
num = randomize();
}else{
print("H ");
}
return num;
}

首先列出可以合法退货的每一项。

然后,洗牌。

然后,要生成一个随机数,只需消耗洗牌列表中的下一个项目。Voila-现在,如果你永远不想要超过4倍的1,请确保原始列表中最多只有4个1值。

我不知道你的random(0, 5)做什么,但用它来生成随机数听起来像是被设计打破了(鸽子洞原理(——java有一个random类,它有一个更好的API,没有被破坏,无论如何都要使用它。

class Randomizer {
private static final List<Integer> INPUTS = List.of(0, 0, 1, 1, 1, 1, 2, 3, 3, 4);
private final List<Integer> list;
private int pos = 0;
public Randomizer() {
list = new ArrayList<Integer>(INPUTS);
Collections.shuffle(list);
}
public int next() {
return list.get(pos++);
}
}

注意:一旦你的随机数"用完",上面会抛出IndexOutOfBoundsException。如果你想要其他行为,请将其编码。例如,如果你希望算法重新开始(按随机顺序重新返回0/0/1/1/1/2/3/3/4,重新刷新顺序(,那么你可以这样做,比如:

public int next() {
if (pos == list.size()) {
Collections.shuffle(list); // reshuffle
pos = 0;
}
return list.get(pos++);
}

最新更新