gpt4 book ai didi

java - 我的方法有效吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:03:19 25 4
gpt4 key购买 nike

我正在为一副纸牌编写一个代码,用于洗牌。我测试了代码,但我真的不知道它是否真的在做它应该做的事情?你怎么看?

这是随机播放方法的代码:

public void shuffle()
{
for( int x = myDeck.size(); x > 0 ; x--)
{
Random rn = new Random();
int index1 = rn.nextInt(52);
Card c = myDeck.remove(index1);
myDeck.add(c);
}
}

我的输出似乎在数字上打乱了,但没有像黑桃红心之类的卡片名称,

例如,这是我测试代码时的输出:

Deuce of spades
Seven of spades
Eight of spades
Ace of spades
Three of hearts
Five of hearts
Six of hearts
Seven of hearts
Nine of hearts
Ten of hearts
Queen of hearts
King of hearts
Ace of hearts
Seven of diamonds
Eight of diamonds
Jack of diamonds
King of diamonds
Three of clubs
Seven of clubs
Nine of clubs
Jack of clubs
Queen of clubs
King of clubs
Ace of clubs
Queen of spades
Deuce of clubs
Three of spades
Nine of diamonds
Four of spades
Four of clubs
Deuce of hearts
Jack of spades
Ten of clubs
Six of diamonds
Jack of hearts
Six of clubs
Four of diamonds
Five of diamonds
Ace of diamonds
Four of hearts
Nine of spades
Ten of spades
Five of spades
Three of diamonds
Six of spades
Five of clubs
Deuce of diamonds
Eight of hearts
King of spades
Ten of diamonds
Eight of clubs
Queen of diamonds

好像总是有重复的名字。洗牌的目的是把它混在一起,这是不是错了?

这才是真正的问题:打牌时,洗牌当然很重要,也就是安排事情,以便卡片将以随机顺序处理。有实现这一目标的几种方法。一种策略是反复挑选一张牌随机离开甲板并将其移动到尽头。下面的代码使用Random 类(您在第 8 页的“ArrayLists”部分遇到过在线类(class))执行这样的“拾取并移动到最后”操作:

Random rn = new Random();
int index1 = rn.nextInt( 52 );
Card c = myDeck.remove( index1 );
myDeck.add( c );

要有效地洗牌,这个操作应该重复多次(比如说,500 次)。为 Deck 类创建一个新的实例方法 shuffle它使用单个 Random 对象和一个 for 循环来洗牌 myDeck。后适当修改main方法,用它来测试你的新代码。

所以我的主要问题是:我做错了吗?

最佳答案

只需将 rn.nextInt(52); 更改为 rn.nextInt(x) 即可获得合适的 Fisher-Yates shuffle .无需进行超过 52 次迭代。

为什么会这样:

  • 在第一次迭代中(当 x 为 52 时)您将从整副牌中随机选择一张牌并将其最后移动。

  • 在第二次迭代中(当 x 为 51 时)您将从剩余 牌中随机选择一张牌并将其最后移动。

    ...等等。

  • 经过 52 次迭代后,选择的第一张卡片将出现在第一个索引中。由于这张牌是从整副牌中随机抽取的,因此每张牌的概率均等。

  • 同样适用于第二个索引、第三个索引...

  • 因此,这副牌的每个可能排列都是等概率的。


(在生产代码中,在这些情况下只需使用 Collections.shuffle。)

关于java - 我的方法有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11835860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com