Showroom - 福引するプログラムとその結果 (1)
ふだん使うアバターは決まっているので、福引してアバターもらっても何の意味もないのですが、1等や2等がどのくらいの確率で出てくるのか気になります。
以前「1等は100回に1回必ず出る」という“主張”を聞いたことがあるのですが、これは勘違いでしょう。300回福引をして一回も1等が出なかったことがありますから。もちろん逆もあります。この記事を書く前に10枚だけ福引をやってみました。そしたらこんな結果になりました。
この結果から1等が出る確率が0.1であると言えないことはもちろんです。
--------------------------
リスナーレベル向上を目標としていた頃は福引券が3ヶ月で6,000枚以上たまりました。今でも3,000枚くらいはたまりますので確率を検討するにはまあまあの枚数でしょう。
ただ、何千枚も福引を引いて何等が出たか記録していくというのはとてもやってられません。そこでまたまたgo/agoutiで福引をして、結果を記録するプログラムを作ってみることにしました。
どうもまだ“問題”が残ってそうな気がしますが、“たたき台”にできるほどにはなっていると思うのでこの記事の末尾にソースを添付しておきます。
このプログラムで385枚福引を引いてみました。(100枚くらいずつ4回にわけて引きました)
結果は以下のとおりです。
これだけ見ると1等は100回に1回くらい出てるように見えますが、これだけでそうと断言できるわけでもありません。
仮に100回に一回1等が出るとすると300回引いて一回も一等が出ない確率は (99/100)^300 ということで0.05となりますのでふつうにありえる話です。
1回め3等、2回め5等、3回め4等、.....と進行しています。
今回の記事は「(1)」となっていますが、「(2)」は3,000枚くらいたまってからになるので2ヶ月後くらいになると思います。
-------------------------
参考
「Showroom - 自動星集め・星投げ・カウントツール)」 (使用法とソースつき)
「Showroom - 自動三周ツール(もう一つの自動星集め・星投げ・カウントツール)」
「Showroom - イベントの獲得ポイント数を取得して記録するツール」
「Showroom - 福引するプログラムとその結果 (1)」
「Showroomの複数アカウント(複アカ、複垢)について考えてみた(1)」
「Showroom - 複数アカウント(複垢)問題の真実 - 実験計画」
「Showroomの重複アカウント(複垢)減算はこうして起きる」
「Showroomでの自動星集めの試み (3) ガチイベ、最後の5分間
「Showroom ラスカルイベの最後の5分間」
「Showroomでの自動星集めの試み (1)」
「Showroomでの自動星集めの試み (2) 配信ルームの一覧を作る」
「Showroomでの自動星集めの試み (4) 星集めツール」
「Showroomでひたすらリスナーレベルを上げるための星集めツール(Go/Agouti)」
「超初心者のGo言語/agouti - ブラウザ操作の基本の基本」
「超初心者のGo言語 - 複数の戻り値をもつ関数」
「超初心者のGo言語 - もっとも簡単なGoroutine(並列処理)」
---------------------
「GoDoc - package agouti」
「Qiita @0829 - Goではじめてみたブラウザの自動操作」
「Qiita @tenten0213 - agoutiというWebDriverクライアントを使って面倒な作業を自動化する」
「Qiita @masaru_b_cl - Windows上でGo言語初心者向け学習環境を作る」
「はじめてのGo言語」
「天才まくまくノート - まくまく Hugo/Go ノート - 関数を定義する (func)」
「Qiita @TakaakiFuruse - Golang Goの並列処理を学ぶ(goroutine, channel)」
「Qiita @To_BB - Rubyエンジニアがゴルーチン(Go言語)を学んでみた【初心者向け】」
「Qiita @fukumone - goroutine 使い方まとめ」
=======================
package main import "github.com/sclevine/agouti" import "time" import "fmt" import "os" import "strconv" // Showroomで福引をやって各等の出現回数をカウントする // // **重要** Showroomへのログインや設定は終わっているChrome作業フォルダを使うことが前提です。 //
// **重要** まだ作成中(デバッグ中)です。挙動がヘンなときがあります。 // おそらくボタンを押すタイミングに問題あり。 // また画面が正常に遷移しなかった場合の対策の不足 // なおelementを探すのは基本的には FindByID(id) を使っていますが // 一箇所だけ Find(selector)を使っています // // 起動方法 // lottery 5|6 n // // 5|6 ... 使用するGoogle Chrome作業フォルダのID // 5 ... [DriveLetter]\Tmp\Chrome05 // 6 ... [DriveLetter]\Tmp\Chrome06 // n ..... 福引の回数(とうぜん福引券がなくなれば終わり) // // 福引の名称(例えば "2018_summer")は NameOfLottery.txt に書いておきます。 // (福引へのリンクは“キャンペーン画面”の一番下にあります) // // 注意 処理の間にあるウェイトのウェイト時間はまだ最適化されていません。 // func main() { var Folder int var NCount int // 福引名 var NameOfLottery string // 各等の出現回数を格納する LCount := [5]int{} // Chromeの作業フォルダを置くドライブ(Windows7とWindows10のデュアル起動になっている) // E: ... Windows10 // C: ... Windows7 DriveLetter := "E:" if len(os.Args) == 3 { Folder, _ = strconv.Atoi(os.Args[1]) NCount, _ = strconv.Atoi(os.Args[2]) } else { fmt.Println(os.Args[0], " 5|6 NCount") return } if Folder != 5 && Folder != 6 { fmt.Println(os.Args[0], " 5|6") return } // Chromeを利用することを宣言 agoutiDriver := agouti.ChromeDriver() agoutiDriver.Start() defer agoutiDriver.Stop() // Showroomにログインし(Showroom Toolboxが使える環境を作っておき) // その環境を引き継げるようにShowroomを起動する。 page, _ := agoutiDriver.NewPage(agouti.Desired(agouti.Capabilities{ "chromeOptions": map[string][]string{ "args": []string{ "user-data-dir=" + DriveLetter + "\\Tmp\\Chrome0" + os.Args[1], }, }, }), ) time.Sleep(3 * time.Second) f, _ := os.OpenFile("NameOfLottery.txt", os.O_RDONLY, 0644) NItem, _ := fmt.Fscanf(f, "%s\n", &NameOfLottery) if NItem != 1 { return } f.Close() // 結果出力ファイルを準備する t := time.Now() hh, mm, ss := t.Clock() yr, mt, dy := t.Date() OutputFileName := fmt.Sprintf("Lottery_%4d%02d%02d_%02d%02d%02d.txt", yr, mt, dy, hh, mm, ss) fmt.Println("(", OutputFileName, ")") fout, _ := os.OpenFile(OutputFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) // 福引画面を表示する page.Navigate("https://www.showroom-live.com/lottery/top?k=" + NameOfLottery) time.Sleep(2 * time.Second) // 入力された福引回数だけ繰り返す for i := 0; i < NCount; i++ { // 福引残枚数を取得する time.Sleep(1 * time.Second) TicketCount, Err := page.FindByID("lottery-ticket-count").Text() for Err != nil { fmt.Println(" Err TicketCount = ", TicketCount) time.Sleep(1 * time.Second) TicketCount, Err = page.FindByID("lottery-ticket-count").Text() } // 残福引券枚数を数値にする NTicketCount, _ := strconv.Atoi(TicketCount) if NTicketCount == 0 { // 福引券がなくなったら終わり break } fmt.Println(" TicketCount = ", NTicketCount) // ガラガラを回す time.Sleep(1 * time.Second) page.Find("#js_lottery_garagara > span.lottery-garagara-button-txt1").Click() time.Sleep(1 * time.Second) // あたった“等”を取得する LGN, _ := page.FindByID("lottery-get-number").Text() iLGN, _ := strconv.Atoi(LGN) fmt.Println(" LGN = ", LGN) for iLGN == 0 { // “等”が取得できないときは繰り返す time.Sleep(1 * time.Second) LGN, _ = page.FindByID("lottery-get-number").Text() iLGN, _ = strconv.Atoi(LGN) fmt.Println(" LGN = ", LGN) } // あたった“等”の回数をカウント LCount[iLGN-1]++ fmt.Fprintf(fout, "%5d %s\r\n", NTicketCount, LGN) // プログラム実行中のトラブルへの対策 fout.Close() fout, _ = os.OpenFile(OutputFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) // “等”表示画面を閉じる page.FindByID("js-lottery-get-close").Click() } fmt.Fprintf(fout, "=========\r\n") // “等”の出現回数を書き出す for i := 0; i < 5; i++ { fmt.Fprintf(fout, "%5d", LCount[i]) } fmt.Fprintf(fout, "\r\n") fout.Close() // 終了処理 page.CloseWindow() page.Destroy() }
« Amazonで買った「400000V高電圧発生モジュール」の出力極性 | トップページ | 100Ω抵抗器の端子間で発生した火花放電(沿面放電) »
「パソコン・インターネット」カテゴリの記事
- さくらインターネットのレンタルサーバーでGOで書いたCGIを動かした(苦労)話(2021.04.19)
- SHOWROOMのAPI - 「ライブ情報」の取得(GO言語のソースつき)(2019.10.26)
- SHOWROOM 星集め・星投げツール スケジュールの詳細化 BreakDownSchedule() (三周のやり方を例に)(2019.09.25)
- SHOWROOM 新・自動三周ツール -- GO言語によるブラウザ制御 (1) main()(2019.09.17)
この記事へのコメントは終了しました。
« Amazonで買った「400000V高電圧発生モジュール」の出力極性 | トップページ | 100Ω抵抗器の端子間で発生した火花放電(沿面放電) »
コメント