作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这个方法是我自己写的,请问有没有更好的方法?
public Card[] shuffle(){
for(int i = 0; i < Deck.length; i++){
int x = i + (int) (Math.random() * (32 - i));
Card temp = Deck[i];
Deck[i] = Deck[x];
Deck[x] = temp;
}
return Deck;
}
最佳答案
如果 ( 32 - i )
给出任何小于 0
的值,您就不会检查。该算法称为 Fisher-Yates洗牌算法,与您的非常相似:
private int [] shuffleMyArray ( int [] array ) {
int size = array.length, i = 0;
int temp = 0;
while ( size != 0 ) {
i = ( ( int ) ( Math.random () * size-- ) );
if ( i < 0 ) {
i = 0;
}
temp = array [ size ];
array [ size ] = array [ i ];
array [ i ] = temp;
}
return array;
}
编辑 1:
两种算法的输出将更好地让您理解两者之间的区别,看看 Fisher-Yates
如何在改组时考虑所有索引。
输出:
Actual Array
0 1 2 3 4
Your Implementation output
i: 0 x: 3
i: 1 x: 4
i: 2 x: 3
i: 3 x: 4
i: 4 x: 4
Fisher Yates implementation output
i: 4 size: 4
i: 2 size: 3
i: 1 size: 2
i: 0 size: 1
i: 0 size: 0
关于Java:洗一副 32 张牌?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30745786/
我正在尝试模拟“发现它!”的套牌用 Python 制作的卡片。对于那些不知道什么是“Spot it!”的人is- 这是一种流行的纸牌游戏,一副牌有 55 张牌,每张牌上有 8 个随机符号(例如球、波浪
我目前正在尝试解决与其他人编写的程序相关的问题,该程序使用 Jackcess 版本 1.1.8 将信息写入 Access 数据库。在向给定 Access 表添加 400 万行的运行中,出现以下异常:
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我是一名优秀的程序员,十分优秀!