Little Strange Software

スマホアプリの開発を行う LittleStrangeSoftware のブログです。

Try Kotlinで、過去の過ちを(わざわざ)再現してみますw(プログラミング以前の問題)

 どうも!LSSです!!

 

 今回は、Try Kotlinを使って
「昔、ポケコンBASICをいじってた頃にやった過ちを再現」
してみます。

 

 

try.kotlinlang.org

 

 えーと、それはトランプゲームのようなカードゲームを作ろうとした時に、やらかした過ちです。

 

 たいていのトランプゲームはまず、カードをシャッフルしますよね。

 それをプログラミングで再現しようとしたのです。

 

f:id:little_strange:20200217232150p:plain

 

 ↑の画面のようなものを作りました。

 コードは、

 

import kotlin.random.Random

var cards="0123456789012345678901234567890123456789"
var r=0

fun main(args: Array<String>) {
    for(i in 0..9999){
        r=Random.nextInt(39)+1
        cards=cards.substring(r)+cards.substring(0,r)
    }
    print(cards)
}

 

という感じですね。

 

  まずcardsという文字列変数に1文字=1枚に見立てたカードを設定します。

 この場合、0~9までのカードを4組、合計40枚のカードという事になります。

 

 そして、

 for(i in 0..9999){

 で、1万回ループを回します。

 

 1万回シャッフルするイメージですね。
ポケコンの時は処理速度が遅いので、1万回よりは少ない回数だったと思いますが^^;

 

 そのループの中で、

 r=Random.nextInt(39)+1

 にてランダムに何文字めか(=何枚めか)を決め、

cards=cards.substring(r)+cards.substring(0,r)

「〇枚目までのカードと〇枚目以降のカードを入れ替える」という処理をシミュレーションしているわけです。

 

 トランプで言うと、

「積み重ねたカードを適当な位置で2つに分けて(カット)、上下を入れ替える」

という作業に相当します。

 

 

…さて、それを1万回もやれば、さぞ、ぐちゃぐちゃに混ざるであろう…と期待していたのですが…!!

 

2345678901234567890123456789012345678901

 

…結果としては↑こんな感じになります。

 

 えーと…?

 1文字目は確かに変わっているけど、0123456789という順番はそのままで、何度試してもお行儀よく順番に並んでいますね^^;;;;;;

 

「なんでだ!?ループが正常にループしないで1回だけで終了しているのか!?」

と、当時のLSSは悩んだものでしたw

 

 

 トランプを手元にお持ちの方は、お試しいただくと分かる事ですが…

 

「適当な位置でカットし、上下を入れ替える」という作業は何回、何万回繰り返しても、中のカードの順番は変わりません!!

 

 その作業をシミュレーションする、という意味ではプログラムは完璧でした。

 

 完璧ゆえに、現実と同様に「全く順番が変わらない」という状況をも再現してしまったんですねーw

 

 いやー、悩んだ悩んだwww

 

 気づいた時には自分の間抜けっぷりにビックリしましたねw

 

ですが、更に後には「これを応用したトランプの手品がある」と知り、

「ああ、自分は偶然に手品のタネを見つけてしまっていたのだなぁ」
と思いました^^