思路:
- 假设原始数组P长度为54,数组中每个元素对应着一张牌,每次洗牌的工程相当于对数组中的元素随机重新排列,随机重排过后,第一个元素开始,一次发牌给玩家,就能保证玩家的牌是随机的了。
- 而随机的过程则是通过不断的循环,随机函数,直到将原数组所有元素全部放到新的数组为止。
- 每次产生的随机数,都与最后一个值进行交换,这样做的好处是,不再需要辅助数组Q,等循环结束时,数组P本身就是对原来数组随机重排的结果,可以省去O(n)的空间复杂度。
写法:
jsconst data = ["方块A", "梅花A", ..."大王"];
function init() {
const newData = [];
for (let i = 0; i < data.length; i++) {
const activeIndex = Math.floor(Math.random() * (54 - i));
newData.push(data[activeIndex]);
const temp = data[activeIndex];
data[activeIndex] = data[54 - i - 1];
data[54 - i - 1] = temp;
}
}
结果:
Go
package main
import (
“fmt”
“math/rand”
)
func main() {
var arr [54]string
arr[0] = “方块A”
arr[1] = “梅花A”
arr[2] = “红心A”
arr[3] = “黑桃A”
arr[4] = “方块2”
arr[5] = “梅花2”
arr[6] = “红心2”
arr[7] = “黑桃2”
arr[8] = “方块3”
arr[9] = “梅花3”
arr[10] = “红心3”
arr[11] = “黑桃3”
arr[12] = “方块4”
arr[13] = “梅花4”
arr[14] = “红心4”
arr[15] = “黑桃4”
arr[16] = “方块5”
arr[17] = “梅花5”
arr[18] = “红心5”
arr[19] = “黑桃5”
arr[20] = “方块6”
arr[21] = “梅花6”
arr[22] = “红心6”
arr[23] = “黑桃6”
arr[24] = “方块7”
arr[25] = “梅花7”
arr[26] = “红心7”
arr[27] = “黑桃7”
arr[28] = “方块8”
arr[29] = “梅花8”
arr[30] = “红心8”
arr[31] = “黑桃8”
arr[32] = “方块9”
arr[33] = “梅花9”
arr[34] = “红心9”
arr[35] = “黑桃9”
arr[36] = “方块10”
arr[37] = “梅花10”
arr[38] = “红心10”
arr[39] = “黑桃10”
arr[40] = “方块J”
arr[41] = “梅花J”
arr[42] = “红心J”
arr[43] = “黑桃J”
arr[44] = “方块Q”
arr[45] = “梅花Q”
arr[46] = “红心Q”
arr[47] = “黑桃Q”
arr[48] = “方块K”
arr[49] = “梅花K”
arr[50] = “红心K”
arr[51] = “黑桃K”
arr[52] = “小王”
arr[53] = “大王”
var newData [54]string
for i := 0; i < 54; i++ {
activeIndex := rand.Intn(54 - i)
temp := arr[activeIndex]newData[i] = temp<br /> arr[activeIndex] = arr[54 - i - 1]<br /> arr[54 - i -1] = temp<br /> }
fmt.Println(newData)
}
结果:
