・野菜の袋詰め                         GAI 氏

 スーパーに買い物で訪れると、野菜売り場などにピーマンやジャガイモなどが袋詰めされ
た状態で売られている風景を見る。でもよく考えると、一個一個の大きさや重さが異なった
ものたちをどの様に、そのメンバーで袋詰めされているんだろうと、ふと思う。

 手掛かりは大きさには関係せず、それぞれの重さを何等かの方法で上手く組み合わせて
全体での総重量が同じになる仕組みがあるのだろう。

tetsuさんからのコメントです。(平成30年7月6日付け)→現実世界ではこんな感じみたいです。

 上記の推測を実験するために、ピーマンの代わりに6個のサイコロを準備する。
(重さがランダムに1,2,3,4,5,6(g)であると見なす。)

 そして、サイコロを振り、出た6個の目から適当なものを選んでその目の和を10にすること
を試みる。

 さて、和を10にできる確率や如何に?

 また、客には申し訳ないが、±1(g)までの誤差認可で袋詰め(即ち総重量9(g)、11(g)も市
場に出ることを許す。)を行う時の確率は?

#最初プログラムを組んで何とかしようとしていましたが、何でもよい組み合わせで10にす
 ることを実行させる仕組みが作れず挫折し、ほんとに手作業での準備しかしていません。
 もしプログラム的、もしくは計算式の構築が出来た方は、10個のサイコロで、出た目のい
 くつかを合わせて30が出来る確率がいくつか教えて下さい。
 (さすがにこれは手作業でやろうとは思いません。)


 らすかるさんからのコメントです。(平成30年7月5日付け)

 プログラムを作りましたが、もし、

 6個のサイコロで「和が10」が作れる確率が、22837/23328 ≒ 0.978952
 6個のサイコロで「和が9〜11」が作れる確率が、15533/15552 ≒ 0.998778

が合っていれば、10個のサイコロで「和が30」が作れる確率は、多分

   50865583/60466176 ≒ 0.841224

になると思います。


 GAI さんからのコメントです。(平成30年7月5日付け)

 [調べ方]

 6個のサイコロが作り出す数の組み合わせパターンを、6H6=11C6=11C5=462(通り)作り

出し([1,1,1,1,1,1],[1,1,1,1,1,2],・・・・・,[6,6,6,6,6,6])、実際に和を10にできるもののパターンに

チェックしカウントすると、421個確認。
(41個の数での組み合わせでは10が作れない。例[1,1,1,1,2,3],[1,3,4,4,4,4],[2,3,3,3,6,6]など)

 したがって、10が構成できる確率 421/462(≒0.9112554)

 また、「和が9〜11」は、上の41パターン中その組み合わせでの数で9または11を作れるも
のをチェックして、32個がOK!で、求める確率は、(421+32)/462=151/154(≒0.980519)

 最初、重複順列 6^6=46656(通り)で調べていたんですが、調べる途中から混乱しだし、重
複組み合わせでいいのではないかと考え直し手作業になりました。
(順列で考えても10を構成する数のパターンは同じだからしかも一通りとは限らないし、サイ
コロは、462パターンは平等に起こしてくれると思えたからです。)

 見返しをしてみて、逆に、「和が9〜11」とならないパターンを462(通り)の組み合わせから
探すと、

[1,1,1,1,1,1]、[1,1,1,1,1,2]、[1,1,1,1,1,3]、[1,1,1,1,2,2]、[1,1,6,6,6,6]、[1,6,6,6,6,6]、[2,6,6,6,6,6]
[4,4,4,4,4,4]、[6,6,6,6,6,6]

の9通りがあり、これから生み出される順列が総計は、

 1+6+6+6!/(4!*2!)+6!/(4!*2!)+6+6+1+1=57

 よって求める確率が、 (6^6-57)/6^6=15533/15552 となっている訳ですね。

 従って、和を10にする確率を出すなら、だめになる41パターンから全部でいくつの順列が
生み出されるかを総計して、(6^6-総計)/6^6 の計算をしなくてはいけませんね。

 やっと自分の間違いがわかりました。


 GAI さんからのコメントです。(平成30年7月7日付け)

 tetsuさん、ありがとうございます。日本人ってすごいですね。こんな発想を具現化できる道
具を作り出せるって素晴らしい!

 苦労していたプログラムを他の言語へ変更してRubyを用いたら、らすかるさんの結果と同
じものを出せるコーディングが出来ました。ちなみに「サイコロ10個で和40」の確率を計算し
たら、 10964657/60466176(≒0.181335・・・) となり、これではいくら機械を用いても能率悪
くなりそうです。適切な重さの袋詰めと適当なばらつきがなければいけない感じですね。


 らすかるさんからのコメントです。(平成30年7月7日付け)

 現実には「サイコロ10個」のような少ないケースはないのでは?
(というか、そんなに少ない場合は人間がいいかげんやればいい)

 「サイコロ20個で和40」ならば、0.999984…になりますので問題ないように思います。


 DD++さんからのコメントです。(平成30年7月7日付け)

 サイコロ10個の出目の合計の期待値は35なわけなので、そもそも全部詰めても40に届か
ない状況が大半を占めているような。


 GAI さんからのコメントです。(平成30年7月7日付け)

 せっかく作ったプログラムなので、「和が35」での確率を求めてみたら、

   7893017/15116544(≒ 0.522144・・・)

となり、先ほどの値より向上しました。(当たり前か)

 和がいくつの時それぞれ確率がどの様に変化していくのか見てみたいのですが、なにしろ
和の値にもよりますが、全パターンをどの様な組み合わせでも和を調べる調査をやるように
プログラムを組んでいるので、一つだけでもとても時間が掛かってしまいます。

 時間節約のためのアイデアはあるのですが、それをプログラムで書くことができません。
例えば、20個のサイコロなら和の設定をいくつ位にしておけば確率を9割越えに出来るかな
ど知りたいです。(自分のプログラムでは何か月もかかりそうです。)


 らすかるさんからのコメントです。(平成30年7月7日付け)

 サイコロ20個で和が1〜70の場合の確率は以下のようになりましたので、「9割超え」は和
が1〜60の範囲となりますね。1〜6は単調増加、36〜70は単調減少ですが、7〜35は上がっ
たり下がったりの変わった動きになるようです。
(増減の繰り返しですが、偶数/奇数だけをみると単調でない動きをしています)

 最大値は和が12のときのようですね。

20-1: 0.97391594669541
20-2: 0.99819562804107
20-3: 0.99967278038694
20-4: 0.99999260389173
20-5: 0.99999809006746
20-6: 0.99999999684402
20-7: 0.99999713381455
20-8: 0.99999996070733
20-9: 0.99999902667747
20-10: 0.99999999396825
20-11: 0.99999904001206
20-12: 0.99999999999728
20-13: 0.99999903714459
20-14: 0.99999999081758
20-15: 0.99999904631335
20-16: 0.99999999396690
20-17: 0.99999904029744
20-18: 0.99999999999513
20-19: 0.99999904001124
20-20: 0.99999999396847
20-21: 0.99999904631193
20-22: 0.99999999396552
20-23: 0.99999904029529
20-24: 0.99999999999549
20-25: 0.99999904029726
  20-26: 0.99999999395214
20-27: 0.99999904624766
20-28: 0.99999999372105
20-29: 0.99999903944730
20-30: 0.99999999727025
20-31: 0.99999903213891
20-32: 0.99999997109756
20-33: 0.99999898581136
20-34: 0.99999984205346
20-35: 0.99999867656920
20-36: 0.99999916634212
20-37: 0.99999720531385
20-38: 0.99999610408373
20-39: 0.99999108552566
20-40: 0.99998423189515
20-41: 0.99996879070885
20-42: 0.99994363731165
20-43: 0.99989693022016
20-44: 0.99981989051085
20-45: 0.99968939953068
20-46: 0.99948051549626
20-47: 0.99914780861670
20-48: 0.99863638061728
20-49: 0.99786177993229
20-50: 0.99672005080563
  20-51: 0.99506707024239
20-52: 0.99272887629075
20-53: 0.98948262024241
20-54: 0.98506978577570
20-55: 0.97918166291040
20-56: 0.97147888539193
20-57: 0.96158455316531
20-58: 0.94911243316561
20-59: 0.93366934904422
20-60: 0.91489190895663
20-61: 0.89245601914405
20-62: 0.86611814154617
20-63: 0.83572585907094
20-64: 0.80125559202196
20-65: 0.76281560356233
20-66: 0.72067096552795
20-67: 0.67523072995072
20-68: 0.62705369094822
20-69: 0.57681624077602
20-70: 0.52529823675367


 らすかるさんからのコメントです。(平成30年7月8日付け)

 プログラムが正しいことの確認の意味もあり、サイコロがn個(n≧12)のときに和12が作れ
る確率を手計算してみました。

 和12が作れないためには、殆ど全て5(数個以外はすべて5)でなければならないのは明ら
かで、全部のパターンを洗い出すと、

(a) 全部5   (b) 1、残り5   (c) 1、3、残り5   (d) 1、4、残り5   (e) 1、4、4、残り5
(f) 3、残り5   (g) 3、3、残り5   (h) 3、3、3、残り5   (i) 3、6、残り5   (j) 4、残り5
(k) 4、4、残り5   (l) 4、4、6、残り5   (m) 4、6、残り5   (n) 6、残り5

の14パターンとなり、それぞれの場合の数は、

(a) 1通り   (b)(f)(j)(n) n通り   (c)(d)(i)(m) nP2通り   (e)(l) nP3/2通り   (g)(k) nC2通り
(h) nC3通り

なので、和12が作れる確率は、

 1-(1+n*4+nP2*4+nP3/2*2+nC2*2+nC3)/6^n= 1-(n+1)(7n^2+2n+6)/6^(n+1)

となります。実際、n=20のとき、1-21*(7*20^2+2*20+6)/6^21 = 0.9999999999972755557…
となり、前の結果と一致します。

 和12の次に多い和24も、作れないのは「殆ど全て5」の場合のみ。以降多い順に、

和18は、「殆ど全て4」または「殆ど全て5」 、和30は、「殆ど全て4」のみ

和6は、「殆ど全て4」または「殆ど全て5」 、

和16は、「殆ど全て3」または「殆ど全て5」または「殆ど全て6」

などのようになりますね。


 GAI さんからのコメントです。(平成30年7月8日付け)

 10個のサイコロでのある和をモニターするだけでもあれだけの時間(2〜3時間)を要して
いたことを考えると、20個のサイコロでこれだけのパターンの確率をあの短時間で掲載され
ていることがいかに凄いことか!

 効率よい検索の色々な技術をさぞ組み合わせないと、これだけのことは出来ないと想像さ
れます。

 私はマニュアル本を読みながら、まさに見様見真似で積み木で組んでいる様ですのでこん
なものを見せられると、プログラムの技術も奥は深いものだと感慨を持ちます。

 らすかるさんはプログラムの勉強は独学なんですか?それとも誰かの師とかがおられるん
でしょうか?


 らすかるさんからのコメントです。(平成30年7月8日付け)

 独学です。始めたのが40年前(パソコンが出る少し前)で、まわりにマイコンを知ってる人
はいませんでした。プログラム構造や検索などのロジックは、いつも全て自前です。


 moonlight さんからのコメントです。(平成30年7月8日付け)

 久しぶりに覗いたら面白い話が。で、遡って見てみたのだけど、野菜の袋詰めの場合、野
菜の重さの分布が一律ってのはちょっと現実から離れ過ぎているような...。

 分布を現実的にするために、例えば、一つの野菜の重さは「サイコロ6個の目の和にする」
とかすれば、少しはリアルになるのではと思いました。



                         投稿一覧に戻る