🛠 Array.shuffled() 的邏輯修正 🛠

Moonshine 
Moon 沐
Published in
5 min readOct 6, 2018
“green and white maze illustration” by Benjamin Elliott on Unsplash

自從Swift 4.2的亂數語法問世以來
哎啊啊這套亂數劍法就是我的心頭好啊
雖然是還沒有亂得不知所云、無以為繼的
但是也算是亂中有亂的不錯表現了啊
畢竟已經是簡化成這樣簡單方便又好用的語法規則了
比起以前randomDistribution加載GameplayKit
或是更古早之前的arc4random(這個真的很要命!還要轉型別)
應該每天睡前跪著磕頭答謝天地大恩之類的
讓官方能寫出這樣棒的語法來~

閒話且住
話說這個標題並不是我抓到什麼官方的bug
是抓到我自己的邏輯bug並順利修正完成 (讓我甩自己兩個巴掌先)

其實問題很小
但我以前想不出來解不了
就希哩糊塗閉著眼睛交作業了
並日夜祈禱這個世界上沒人發現這個小bug安捏卑微並阿Q地活下去😞😞😞

“boy sitting while covering his face” by Ksenia Makagonova on Unsplash

發現問題 : shuffled()

先讓我們來看一段程式碼

在viewDidLoad()
準備好一個空array來裝shuffled()亂數跑出來的數值
這樣就直接有了一個新的亂數array了耶好方便好好用啊

讓buttonPressed每按一次就輪播一張圖片
但這邊其實有個小問題

事實是六張照片在輪播時
根本是在跑同一個array啊天公伯啊
只是這個array內容跟你原本命名的順序不一樣而已
等於也是在跑一樣的array啊哪來什麼亂數啦😂

解決方法: shuffled() combo

重新看了一次程式碼
發現我只有在viewDidLoad()生成一次的shuffled()
理所當然
就只有一個array的內容可以跑

務求一定要讓他剪不斷理還亂地亂七八糟亂下去安捏
才能不負眾望地達到亂數的最高境界
所以在buttonPressed裡
每當6張圖片播完一個檔次
就要再shuffled()一次重生出新的亂數array
array.shuffled() → 跑完array六張圖 → 重生新的array.shuffled()
以上無限loop安捏

It looks fine.
But still have some issue.
See

解決方法:control statment

雖然隨機事件也很大可能會發生同一個人連續被雷擊中七次之類的事情
但若是這世界上連續被雷擊中七次的人變多了
那麼恐怕就要改寫雷擊的機率了
而且這樣的事件會讓隨機的感受變成很日常

試想如果你家巷子裡住了200位億元樂透得主
每天跟你親切地打招呼
而你是整條巷子裡唯一沒中過樂透的人
你還會覺得樂透得獎機率很低、很難中獎嗎?
不中獎反而才是很稀罕的吧!

因此
我覺得不重複圖片更能有"完全隨機" 的強烈感受
此時我們可以再加入一段控制流程來做判斷
如果發現上一次array跑完的最後一張圖
跟新生array的第一張圖是同樣的
那麼就再重新生成另一個array

Check this out.

OK, it is perfect.
Exactly like I want.

“black pendant lamps with beige glass bulbs” by Erol Ahmed on Unsplash

以上就是這次的 "微微假亂數 ᛫ 全新真感受" 的debug過程~

其實這真是個小小小問題
但當數據量大的時候
特別是當array的內容一直增加到很大很龐雜的時候
躲在這個小地方的bug便不容易發現

很容易誤以為在第一次shuffled()亂數之後
猛一看排列不是原本照順序的內容
因此就很放心地以為此後就是一路亂數下去

這個邏輯是很不嚴謹的
更容易使我們忽略背後其實還藏著問題

不過如果是驚人的大數據
要跑完一輪的數量已大過人腦能記憶、辨識的差異性
或許就沒有這個問題
當然不意外地
那也會有其他的問題
而這又是另一個故事了。

人生就是不斷地解問題
寫code,也在寫人生🤓
Hope you enjoy my work.

“woman sitting on yellow paddle board during daytime” by Gus Moretta on Unsplash

--

--