如何使用math.random()生成无重复的随机数?

agyaoht7  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(548)

这个问题在这里已经有答案了

创建无重复的随机数(18个答案)
三天前关门了。
我正在做一个程序,将模拟21点的简化版本。每当有人抽一张牌时,它就不能再用了。到目前为止,我已经学习了math.random()函数,所以我确信我应该在这个赋值中使用它。
我的第一次尝试是创建一个52张布尔数组(一张牌组中有52张牌)并使用以下代码行: int playerCard = (int) (Math.random() * 52); . 我将手动检查所有52种可能性,并将它们分配给数组中的一个索引。我意识到这将花费太多的时间和精力,特别是因为我必须在这项任务中多次这样做。如果每个人每次都想生成不重复的随机数,那就没有效率了。
注:如有可能,请尽量不要使用 import java.util.Random; ,但扫描仪正常。另外,如果这改变了什么,我将把它放在for循环中。

z9smfwbn

z9smfwbn1#

在列表中保留可用的卡(或卡索引)。然后移除随机卡片(或索引),如下所示:

Random random = new Random();
List<Card> deck = new ArrayList<>();
// ...
int randomIndex = random.nextInt(deck.size());
Card nextCard = deck.remove(randomIndex);
nvbavucw

nvbavucw2#

一个解决方案是创建一个 boolean[] 大小为52的,记录卡是否被调用。例如:

boolean[] cardCalled = new boolean[52];

然后,无论何时生成新卡:

int playerCard;
do {
    playerCard = (int) (Math.random() * 52);
} while(cardCalled[playerCard]);
cardCalled[playerCard] = true;

现在你有了 playerCard 工作,这是保证一个新的卡在游戏中。
重新排列牌组(将所有牌放回牌组):

cardCalled = new boolean[52];

相关问题