ホームへ戻る|Data Base 桐 User Board|過去ログ一覧|検索|プロパティ |ほっ! |
▼過去ログ No132 |
書き込み数 : 6600件 |
|
|
||||||||||||
Meだからでないですか? 全く同じプログラムをMeで動かしたら 10倍程の時間になった事あります 98に再インストしました |
|
|
||||||||||||
<6590>の方法AとBが定義とその後の使用で逆になってますが^^; <6587>でコード化したつもりの「失敗した場合をカウントしない。」を方法Bで均等、 だとすると、方法Aでは「『失敗した場合を均等に』割振っている」かどうか。 これが完全に乱数で選択しているので均等なような気がしますが、よく考えると 「2143」のような「昇順の順列からすべてペアで交換した形」のものは、失敗した場合 からの交換では発生し得ないので、均等になりません。<6584>にある3パターンですね。 <6593>で私の書いたn-1番目でなく乱数で交換するのも同じ理由でだめです。 森の中で木が均等になるのを求めているのに、葉を均等にする方法を使っているからだめ? nが奇数の場合ならOK?でもないか? |
|
|
||||||||||||
木を見ずして森を見る、森が均等かどうか問題でして、、 局所的に不均衡が目に付くのでしょうが、局所自体が乱数で選ばれている訳なので、森は均等になるのではという気がしています。 <6590>の方法Bは直感的に均等だと感じます。多分、きっと、今のところ、均等に違いない。 その前提では<6590>に書いた理由で、方法Aは均等になります。 方法Bも局所を見ると、n-1回目で同様に不均衡が目に付くと思います。 しかし、2回目以降全て局所的には不均衡なんです。 局所自体が乱数で選ばれていますので森が均等になる気がします。 以上はあくまで私の感じで、それほど自身ありませんが <6590>「方法Bが均等なら方法Aは均等」は証明済みとして良いと思います。 |
|
|
||||||||||||
>少なくとも私( ONnoji )の場合は、何度も何度も閉口しています。 >他の皆様も同じだろうと思います。 ↑ これはフォームを閉じるときに[ソース値更新]イベントが発生することに対してのコメントです。 |
|
|
||||||||||||
>この症状は皆さんのところでも同じでしょうか? 少なくとも私( ONnoji )の場合は、何度も何度も閉口しています。 他の皆様も同じだろうと思います。 テキストボックスにキャレットがある時、 つまりエディタの中にいる時、 この状態で、タイトルバーの[×]ボタンをクリックや、 機能名:閉じるのコマンドボタンを実行した場合、 [ソース値更新]イベントが発生します。 [ソース値更新]イベントが発生するのはフォームを閉じるときに、 表示モードに遷移することが原因だと思います。 コマンドボタンでフォームを閉じる場合は、 フラグを立てて、[ソース値更新]イベントハンドラ内で、 if ... else ... end すれば何とかなります。 その他に、入力前の仮引き数:&編集文字列 と、 入力後の仮引き数:&編集文字列を比較するという方法もありますね。 しかし、タイトルバーの[×]ボタンの場合はお手上げです。 そんなわけで、私は[ソース値更新]イベントを一切使わない事にしました。 |
|
|
||||||||||||
うーん、どうも違います。 並べ替えコマンドをソース値更新イベントから、メインやフォーム開始へ移してみても 同じ現象です。(;;) というか、さらに酷い状況になります。なにも(検索など)しなくても一旦開いたTB Lを閉じるのに10秒以上掛かってしまいます。 こいつは明らかに変です。こうなると、なんとなく、桐の問題じゃない気がします。(予感) 15ネンマエ、Yankee Doodleヲ、シコクキリケンキュウカイノ「ボ」クワナサンニイタダイタ、ワタシノヨカン...ウソ! 明日、別のマシンでチェックします。お騒がせして済みません。 たこすぱげてぃ 1000レコードくらいのサンプルデータでチェックしていたときにはまったくわから なかったのに・・・(実際には常時20万レコード程度で運用されます) あっ、ちにみに前提条件としてフォームはテキストオブジェクトのソースに変数のみが 指定されておりTBLは、フォームの編集対象表として関連付けずに「メイン」で開い ています。(フォームにテーブルを編集表として設定したファイルは何も問題ありませ ん)ついでにOSはMeです。 |
|
|
||||||||||||
ファイルが閉じるのが異様に遅い現象に遭遇いたしておりまして、苦心しております。 TBLおよそ20MB、約3万レコード程度なのですが、フォームでのファイルクローズに V8で15秒程度かかります。(その間、砂時計が出っ放しで、オーバーラップなものでフリーズ 状態のようになります。最終的には帰って来ますけど・・・) バックアップはもちろん無しです。クローズ時間のかかるTBLを直接開いて、閉じれば当然瞬時! トレース出力ウインドウでも、あきらかにDBのクローズに時間がかかっています。 ??? とりあえず、V9の体験版を落として、チェックしました。 「おっ?瞬時にクローズするじゃないか?なんだ、V9で直したんだ!」と一瞬、胸を撫で下ろした のですが、実は甘くありませんでした。 2度目、3度目とチェックを繰り返すうちにどんどんクローズに時間がかかるようになってきまして、結局、数 回繰り返すうちにV8と同じ速度になってしまいました。 「おっ、まい、ガ!」 なんだこれは、ということで、また、深い暗闇に潜入するハメになりました。 先日同じように、一つずつオブジェクトを削除しながら、チェック!また、イベントを一行づつ削除 しながら、またチェック。非生産的な気が遠くなるような作業を続けます。 そして、最終的に付きとめたのが「ソース値更新イベント」でした。 ソース値更新イベントで「並べ替え 索引名=<索引名>」コマンドが実行されると、まずクローズ に時間(およそ3、4秒)が掛かるようになります。さらに、その索引の「主整列項目」に対して検 索コマンドなどが実行されると、さらに時間(10数秒)が掛かるようになります。 しかし、その整列状態で、主整列項目以外の項目に対して検索を行うのであれば、クローズは瞬時で す。また、解除コマンドを発行しても、症状は変わりません。 この症状は皆さんのところでも同じでしょうか? なんだか、私だけのような気がする・・・(悲しい) たこすぱげてぃ |
|
|
||||||||||||
あれ〜?やっぱりn-1回目だけ調整するのは敗者復活になってしまいませんか? 例えばn=4で仮に番号が1234の順に取り出されたとして、席が23の順に決まった後、 3番目の番号3は席1と4の2つから乱数で1/2の確率で1を選んだ時に均等になっている としたら、番号4が席4に入れないのを見越して番号3を4に入れてしまったら 確率が2倍になってしまいます。 席が21の順に決まった場合は番号3が自動的に席4に入るので元々100%で、23に対して 2倍で均等だったわけなので?? n番目にだめだったら乱数で入れ替えるか、前に言ってた n+1で作ってみてn+1番目がn+1以外だったらn+1の入ってるところと入れ替える なんてのが使えるかもしれません。 |
|
|
||||||||||||
あれ〜?そうか、「#乱数(3)と#乱数(2)を使い分け」しているので事象の数が うまく数えられませんが、最後だけ調整してうまいことT(n)に丸め込めたのかな? |
|
|
||||||||||||
あ、もちろん 方法A n-1回目に、残っている番号(の少なくとも片方)と同番号の席が残っていない場合、 は乱数ね 私はどうも表現が雑だな^_^; |
|
|
||||||||||||
<6588> > 均等にはなっているはず? 均等になっている気がします。うん、多分、均等。 それならば、有限時間で回答が出せますよね (*^^)v って思うのですが、また外してるかな? ちなみに今は酔っていない:) 以前にも似たような方法を書いたのですが、 方法A 『乱数で席を選んで乱数で番号を埋めていく、(n-1)回目の操作時に は最後の席番号が一致しないように番号と席を選ぶ』 (残っている番号(の少なくとも片方)と同番号の席が残っている場合、 同番号では無い方の席に入れる) その理由 方法B 『乱数で席を選んで乱数で番号を埋めていき、最後の席だけ番号が一致したらやり直し』 が均等である為には、上記方法Aが均等である必要がある。 方法Aは、失敗した場合をカウントしない。 方法Bは、方法Aに加えて、『失敗した場合を均等に』割振っている。 |
|
|
||||||||||||
何かと思ったら、イベント定義というか一括処理のエディタでの話なんですね。 ここだけ検索機能がちょっと違いますね。 |
|
|
||||||||||||
<6587>でやってみると、最後に残った座席と番号が一致してしまう率が<6585>の計算より低くなりました。 <6585>のは、「全部のパターンから成功するのと最後に失敗するのを集計」してたので、 途中で「逆指定席に引っかからないように座席を選択」している分成功率が上がってしまって いるようです。 均等にはなっているはず? |
|
|
||||||||||||
変数宣言 数値{&n} &n = 5 変数 数値{&結果[&n],&番号[&n],&座席[&n],&i,&j,&c,&t} for &i = 1,&n &番号[&i]=&i, &座席[&i]=&i, &結果[&i]=0 end for &i = 1, &n - 1 *未使用の番号をランダムに取り出す &c = #乱数(&n - &i + 1) + &i &t = &番号[&c], &番号[&c] = &番号[&i] *逆指定席に引っかからないように座席を選択 &c = #乱数(&n - &i + 1 - #COND(&結果[&t] = 0, 1, 1, 0)) + &i if (&結果[&t] = 0) for &j = &i, &c if (&座席[&j] = &t) &c = &c + 1 break end end end &結果[&座席[&c]] = &t *使用済みの座席を保存する必要は無い &座席[&c] = &座席[&i] end *失敗した場合 if (&番号[&n] = &座席[&n]) &t=#配列代入("結果",0) else &結果[&座席[&n]] = &番号[&n] end |
|
|
||||||||||||
うにんさん、おはようございます。 >3、さらに残りの座席から乱数で1つ選び、2と同様の操作を繰り返す 入れ替えた相手も、一度触った座席は「さらに残りの座席」には含まれて居ませんです。 表現が雑でしたか^_^; |
|
|
||||||||||||
「乱数で席を選んで乱数で番号を埋めていく」方法で、「最後の席だけ番号が一致したら やり直し」にすると均等かつやり直しが少なくすみます。 条件を満たす順列の数を「たゆー数」T(n)とすると、 成功するパターンは、座席の処理順n!*順列の数T(n) 失敗するパターンは、n-1に対して成功するパターン数(n-1)!*T(n-1)*最後に失敗するパターン数nで結局n!*T(n-1)となります。 失敗する確率はT(n-1)/(T(n-1)+T(n))ですが、T(n)はおよそn*T(n-1)なので、約1/(n+1)。 n=100ならリトライ数平均0.01位になるでしょう。 <6571>の同値は、 >入っている番号が座席番号と同じなら、残りの座席から乱数で座席を選んで入れ替える の場合に >3、さらに残りの座席から乱数で1つ選び、2と同様の操作を繰り返す が微妙に違うので成立してないようです。 (入れ替えたものをそのまま使ってるので、1つ前に選択した番号を使っている) |
|
|
||||||||||||
n=4で576パターンを調べてみたら、2143・3412・4321だけ56で他の6つは68でした。 やっぱり均等ではなかった。 やり方が多少複雑なだけで本質的にはONnojiさんの「歯医者復活」と同じことになっている。 は、はいしゃ。。。 |
|
|
||||||||||||
shuffle08.cmd「乱数で順列作成後、「順位=値」ならやり直す」の追試 をいろいろやってみると、回数が増えれば標準偏差は少なくなり(各組み 合わせの出現回数が均一に近づく)、n=100も1回当たり3秒位で作成できる ので、これなら多遊さんの要求条件に合うと思いますが、どうでしょうか? shuffle08.cmd「乱数で順列作成後、「順位=値」ならやり直す」の結果 n=3 200回 99〜 101 標準偏差 1.00 リトライ数0〜13 平均1.86 標準偏差2.32 処理時間 4秒 n=3 2000回 995〜 1005 標準偏差 5.00 リトライ数0〜16 平均2.04 標準偏差2.43 36秒 n=3 20000回 9958〜10042 標準偏差42.00 リトライ数0〜22 平均2.01 標準偏差2.47 8分 n=4 900回 85〜 125 標準偏差13.16 リトライ数0〜14 平均1.66 標準偏差2.09 0分20秒 n=4 9000回 948〜 1064 標準偏差31.34 リトライ数0〜21 平均1.66 標準偏差2.11 3分 n=4 90000回 9799〜10100 標準偏差93.30 リトライ数0〜23 平均1.67 標準偏差2.11 44分 n=5 4400回 81〜 117 標準偏差 8.59 リトライ数0〜21 平均1.76 標準偏差2.25 2分 n=5 44000回 948〜 1053 標準偏差29.19 リトライ数0〜26 平均1.73 標準偏差2.17 21分 n=5 440000回 9796〜10202 標準偏差89.42 リトライ数0〜39 平均1.73 標準偏差2.17 3時間11分 n=6 26500回 73〜 125 標準偏差 9.50 リトライ数0〜23 平均1.71 標準偏差2.15 15分 n=7 185400回 71〜 131 標準偏差 9.99 リトライ数0〜33 平均1.71 標準偏差2.14 2時間18分 n=100 100回 処理時間 2分 リトライ数0〜10 平均1.59 標準偏差2.14 n=100 1000回 処理時間48分 リトライ数0〜17 平均1.74 標準偏差2.19 |
|
|
||||||||||||
>2.任意の位置の値のn回前までのキューに今回の値が含まれているか判定 アレ!?、n回だと紛らわしいので、以下のように訂正します。 2.任意の位置の値の m回前までのキューに今回の値が含まれているか判定 ※ mの値は適当に決めます。 |
|
|
||||||||||||
>「総当たり作成後、「順位=値」「値の重複」ならやり直す」 私も「下手な鉄砲数打てば当たる」方式で試しています。 そこで、再試行の判定のために、3つのフィルタを用意して試しています。 1.「順位=値」判定 2.任意の位置の値のn回前までのキューに今回の値が含まれているか判定 ※先頭位置と最後位置に適用 3.ゲーム成立の判定 私が必要としている n = 15 の場合、 さすがに「下手な鉄砲数打ってもば当たらず」状態になります。 しかし、そのうちに当たりがでるので、気長に待っています。(^^ゞ |
|
|
||||||||||||
イベントで検索中、画面に見えるのに検索されない・・・? >触った憶えも無い場所に、確かにチェックが入ってました。 >たったこれだけのことに費やした時間は・・・うぅっぅ、悲しい! 上記は先日みた記憶がありますが 文字列検索画面をよくみると「単語単位で検索する」にチェックがいってました チェックをはずすとうまく行きますが、この「単語単位」の意味がわかりづらい 単位の区切りが「コンマ、スペース」でもなく単語中に「コンマ、スペース」が 入ってもよく、なにかルールみたいなのがあるのでしょうね |
|
|
||||||||||||
185400回試行すると、リトライ数33以上が含まれるのは4セットに1セット程度じゃね? まあ、何れにしろ有限時間内で解ける解法は無いかと ^_^; |
|
|
||||||||||||
>「乱数で順列作成後、「順位=値」ならやり直す」が「n=7 185400回で標準偏差 9.99」 の「リトライ数0〜33 平均1.71」を見て、成功率1/3強なのに33回!?と思ったのですが、 (2/3)^33は約1.5e-6で、100万回に1回ぐらいはあっても不思議ではないのでした。 まあ、実用的にはそれでいいんですけど... |
|
|
||||||||||||
<6571>の同値は成立しているはずです。 で、結局のところ「やり直し」なしで、「特定の順列を特定の方法で条件を満たすもの に変換」していて、変換自体は常に同じ結果を出すので、<6559>の 「n!^2をn!/3に割り振っているので、n!/3が十分大きいから均等に見えるだけ」 ということのようです。(n!/3がでなくn!*約3が十分大きい、ですね) n=4までは順列総数24*変換パターン24=576が条件を満たす順列数9の倍数なので たまたま均等になる可能性がありますが、 n=5では14400は44の倍数でないので均等ではありえません。 n=4を10000回で2回やってみると、2回とも3412と4321が少ないようです。 n=5位までなら全部列挙してみれば不均等の証明は簡単にできそうですが。 |
|
|
||||||||||||
総当りなら偏り無く均等のはずなので、各組み合わせ平均100の回数の標 準偏差をみると、「n=5 312500回で標準偏差 9.83」だったので、平均100 で標準偏差10前後を「偏りなし」と言ってよさそうです。 「総当たり作成後、「順位=値」「値の重複」ならやり直す」が 「n=6 26500回で標準偏差 9.32」、「乱数で順列作成」が「n=7 504000回で 標準偏差 9.87」、「乱数で順列作成後、「順位=値」ならやり直す」が 「n=7 185400回で標準偏差 9.99」でした。 「乱数で順列作成後、「順位=値」ならやり直す」が速度と結果の均等さ のバランスからみて「恐らく」問題ない方法かと思います。やり直しも平均 2回以下ですし。 「ほっ!」shuffle08.cmd(総当たり版が shuffle06.cmd)で載せました。 (shuffle.tbl を毎回上書き作成します) |
|
|
||||||||||||
おはようございます。 > 酔っ払いの直感では、乱数で席を選んで乱数で適合する数字を選んでいくしか方法がない気がするのです。 この方法でも均等に等確立で条件を満たした順列を生成することはできないですね。 もう、絶望的です。 |
|
|
||||||||||||
気になって眠れん orzし酔って考えられんけど <6571>の同値が成立すれば解りやすいんだけど その前提で、番号が一致する座席が1つの場合それを入れ替える以外は残りの処理順−乱数、に依存せずに同一の順列が生成されるし 番号が一致する座席が2つの場合はどちらからどちらを入れ替えても同一だし 4つの場合とか、3つの場合とか、要するに、簡単にはいかないと思うのです。 酔っ払いの直感では、乱数で席を選んで乱数で適合する数字を選んでいくしか方法がない気がするのです。 昼間、酔ってない時に、n=2 の正解順列(2,1)から全ての正解順列を順に生成していく方法を考え付きましたが、どうにも複雑さを実感して、 上記の「乱数で席を選んで乱数で番号を埋めていく」他にスマートな方法はなさそうだ と強迫観念に近い思いですのです。 |
|
|
||||||||||||
× 入れ替える座席の中の番号が互いに相手の座席番号と一致するペアが1つでも含まれると ○ 入れ替えるペア相手も座席に同番号を持つ場合 |
|
|
||||||||||||
やっぱり大きな勘違いで大きく外していたーーー ゴメン、もう飲めん、もう寝る |
|
|
||||||||||||
解りやすく考えましょう、うにんさんの方法は、 1、ランダムな数列を生成して座席に埋めます。 2、次に乱数で座席を1つ選び、入っている番号が座席番号と異なれば次へ 入っている番号が座席番号と同じなら、残りの座席から乱数で座席を選んで入れ替える 3、さらに残りの座席から乱数で1つ選び、2と同様の操作を繰り返す と同値でしょうか? 入れ替える座席の中の番号が互いに相手の座席番号と一致するペアが1つでも含まれると 乱数の結果が相違しても同じ順列が生成されるのでは? 実は今も酔ってます^_^; あわてんぼうのコルネが、また外したかな? |
|
|
||||||||||||
「理論的にはちょっと怪しい」と書きましたが、どうも怪しくもないような。 つまり、座席と番号を乱数で並び替えて、同じ処理順に同じ数字があたっていたら 「隣(次)」と入れ替えてるのですが、この「隣」は単に処理順にすぎなくて、次の席も 次の番号も残った使用可能な物から乱数で選ばれたものだからです。 「すべての順列に番号を振る」のは結構色々なところにあるようですが、条件付のは 見当たりませんねえ。 |
|
|
||||||||||||
2000Hz、ノコギリ波に当確が付きました。(パチパチパチ) たこすぱ |
|
|
||||||||||||
>Vectorあたりに「低周波発信機」というのがあるので、色々組み合わせるとか? 先ほど、落としてきました。 ははは、グウです。非常にべりーグウであります。 2000ヘルツあたりから、非常に耳に障ります。早く止めないと頭が痛くなりそうです。 その不快感が、頼もしいまでに好ましいです。 決めました。1500Hzから3000Hzあたりで、一番、いやな音を探します。(わらひ) うにんさん、ありがとうございました。 たこすぱ |
|
|
||||||||||||
>>上のように2倍の開きが生じます。 >純粋な乱数でも開きは生じるので、それが大きすぎたり小さすぎたりしない限り >偏ってるかどうかは何とも言えません。 n = 4 の場合24通りの組み合わせになると思いますが、 単純に数字と左からの位置が同じならNGとすると、 9通りの組み合わせがOKになると思います。 しかし、敗者復活を行なうと、新たに5通りの組み合わせが生じます。 ※なんか比例区で当選みたいな〜(^^ゞ そうすると、ある組み合わせの場合だけ、 1/24の確率が 2/24の確率に変動するように思えるのですが… ※なんかパチンコみたい〜 もともとNGの組み合わせは、15通りあるところ、 その内の5通りだけが、比例区当選というのは、変な気がしてまして、 敗者復活方式というのはヘマだったと思った次第です。(^^ゞ ちなみに n = 5 では、 小選挙区44名に対して、比例区から28名重複当選することになります。 この場合は、1/120 の確率が、2/120の確率になるように思えるのですが… 私は確率とか大の苦手ですが、ざっとこんな感想をお伝えしたいと思ったわけです。(^^ゞ |
|
|
||||||||||||
>4.今回出来上がった札の組み合わせと、前回の札の組み合わせが同じならば、やり直します。 > ※本格的なゲームでは、( n の値が大きい場合)10回くらい前までの組み合わせと同じか調べるんでしょうね。 nが大きければ同じになる確率はほぼ0なので〜と思ったのですが、ゲームによっては 必ずしも全部の札が明示されて始まるとは限らないので、最初の10枚が同じにならないように、 というのはありえるかもしれない。 と思ったのですが、それでも10!より圧倒的に大きい組み合わせ数なので無用かも。 >上のように2倍の開きが生じます。 純粋な乱数でも開きは生じるので、それが大きすぎたり小さすぎたりしない限り 偏ってるかどうかは何とも言えません。で、その後に理由付けをしていてよろしいのですが、 私の<6559>「これは、単に#乱数(265)を20000回発生させたものの集計値 (47〜102で8.74)とほぼ一致しているので、少なくともn=6までではよさそうな気が。」 は「気が」してるだけで何の証明にもなってませんね。とりあえず桐なので 項目集計してみた、というだけです。 ただし、10000回ずつで頻度の最大な順列は違う物になっていて、明白な偏りは とりあえず見当たりません。 |
|
|
||||||||||||
ブザー音なら、正弦波?ノコギリ波? どこかのJRの駅みたいに同じメロディを少しずらして鳴らして「ものすごい不協和音」にするとか:-P |
|
|
||||||||||||
hidetakeさん、お呼びだてしてすみません。m(__)m ご無沙汰しております。 そうですか、知りませんか。ザンネン 当初、システムの CHORD.WAV でも試した(パラメータ繰り返し)のですが、いまいちエラー っぽくならないので、「なんかないかな?」と・・・(^^; >どういうのを「やかましい」というのでしょうねえ。 DOS桐のブザー音(繰り返し)みたいのを考えてました。 「ビーーーーー!」っていうやつです。 OS標準やいくつかのサイトで探してみたのですが、みんなどこか「まろやか」なんですよね。 耳ざわりがいいっていうか。耳に優しい。 一時も早く駆けつけ、エラーを解除しなければならない!!!という緊迫感が無い。(笑) どうしてもなければ、作るしかないか! それとも、「バッカモン!エラーだ!早く確認しろ!!!!」とでもマイクに吹き込もうかしら・・・ たこすぱ |
|
|
||||||||||||
>やはり、n の値が小さいとどうしてもやり直しの回数が増えますね。 ↑ 勘違いしました。m(__)m n の値に関係無くやり直しが生じます。 >2.サイコロの最大値を n → 2 まで変動させ、 > 各回サイコロの出た目で、コンマリストの左から札を抜き取ります。 ↑ コンマリストの左から各回サイコロの出た目の位置の札を抜き取ります。 |
|
|
||||||||||||
ちょっと長くなりますが…(^^ゞ 1.最初に 1,2,…,n のコンマリストを作り 2.サイコロの最大値を n → 2 まで変動させ、 各回サイコロの出た目で、コンマリストの左から札を抜き取ります。 そのためにコンマリストは毎回短くします。 3.残った札を最後に抜き取ります。 4.今回出来上がった札の組み合わせと、前回の札の組み合わせが同じならば、やり直します。 ※本格的なゲームでは、( n の値が大きい場合)10回くらい前までの組み合わせと同じか調べるんでしょうね。 5.札自身の番号と左から数えた順番が同じなら、やり直します。 やはり、n の値が小さいとどうしてもやり直しの回数が増えますね。 そこで、資源の再利用を考えて、次のように改悪してみました。 5.札自身の番号と左から数えた順番が同じなら、今回出来上がった札の組み合わせを反転します。 6.反転した札の組み合わせで、札自身の番号と左から数えた順番が同じなら、やり直します。 上の5・6の手順で敗者復活を目論んだわけですが、敗者復活戦を行なうと、 札の組み合わせの出現頻度に大きな差が現れます。 エッ!?当たり前だろ!、おっしゃる通りです。m(__)m 以下は 敗者復活ありで、n = 4 の場合の1000回試行ですが… result count 2,1,4,3 73 2,3,4,1 132 2,4,1,3 79 3,1,4,2 67 3,4,1,2 75 3,4,2,1 157 4,1,2,3 156 4,3,1,2 114 4,3,2,1 147 上のように2倍の開きが生じます。 この理由は、例えば一回戦敗北の "1,4,3,2" が "2,3,4,1" として敗者復活したからで、 以下の5通りの組み合わせは、敗者復活戦で重複発生するために、 通常の一回戦勝利の組み合わせに比べて2倍生成されのですね。 2,3,4,1 3,4,2,1 4,1,2,3 4,3,1,2 4,3,2,1 しかし、面白いことに、 敗者復活ありで、n = 3 の場合には、 1,3,2 → 2,3,1 2,1,3 → 3,1,2 のように、敗者復活戦で生じる組み合わせは、n = 3 の全組み合わせと同じ2通りなので、 発生のばらつきは少ない。 |
|
|
||||||||||||
どういうのを「やかましい」というのでしょうねえ。 検索してもあまりピンとこなかった。 Vectorあたりに「低周波発信機」というのがあるので、色々組み合わせるとか? メロディならMIDIで作るといいかもしれません。 |
|
|
||||||||||||
> 逆にいうと、nが小さければ「先に全部の(正しい)順列を生成しておいて、その数までの > 乱数で選ぶ」のが一番確実です。<6554>T.Samuraさんの最後の文ですね。 勿論、そうですし、誰もが最初に思いを巡らす方法ですね。 乱数も1回で済みます。 けど、nが相当に小さくないと桐が動いているPCでは無理だし、 少しnが大きくなればスーパーコンピュータでも無理^_^; それでも当初はその方法を頑張って考えていたのですが、 適応する順列に番号を振る方法が思いつかなかった。 未だに解りません。 何か良い方法はありせんかね? |
|
|
||||||||||||
「うにんさんの<6542>」とは<6540>のことだと思いますが、実は私の当初考えたのも 「まず埋める席を乱数で決め、その席に条件を満たす数字を乱数で埋め」だったのですが、 「残りの席から」ないし「残りの数字」を配列から選択するのに、入れ替えが ややこしくてわからなくなったのです^^; 「先に並べておいてから入れ替えてもいいじゃん」と思ってできたのが<6540>ですが、 確かに理論的にはちょっと怪しいです。 「総数2/3が総数1/3へ変換」だと、たとえばn=5で「120を44に」なので、 果たして均等でありえるのか?? 乱数の発生が2(n-1)なので実際は「14400を44に」に相当すると思いますが... しかしn=6で10000回試行すると平均37.7(10000/265なので)に対して25〜55になりました。 20000回で52〜97、標準偏差が8.83です。 これは、単に#乱数(265)を20000回発生させたものの集計値(47〜102で8.74)とほぼ 一致しているので、少なくともn=6までではよさそうな気が。 n!^2をn!/3に割り振っているので、n!/3が十分大きいから均等に見えるだけで理論的には 均等でないのかもしれません。 もしそうだとするとnを大きくするとますます均等に見えてしまうでしょう。 「大きなnで統計的に検証」してみたいのは山々ですが、相手は階乗ででかくなるので 無理です^^; n=10になっただけで100万種類あるわけで。。。 逆にいうと、nが小さければ「先に全部の(正しい)順列を生成しておいて、その数までの 乱数で選ぶ」のが一番確実です。<6554>T.Samuraさんの最後の文ですね。 |
|
|
||||||||||||
> >hidetakeさん (笑)ソウイウノモシッテルトミタ どうも、お久しぶりです。 (^^) お呼びがかかりましたが知らないです。探した事もありません。 (^^; 私の場合、簡単に OS 標準のもので済ませています。 /* ---------------------------------------------------------------------- */ |
|
|
||||||||||||
ディープですね、 ループの初期値だけではなく、席を埋めていく順番自体を乱数で生成すると均等になると思います。 まず埋める席を乱数で決め、その席に条件を満たす数字を乱数で埋め また残りの席から次に埋める席を乱数で決め、その席に条件を満たす数字を乱数で埋め もちろん席と数字は逆でも同様の考え方です。 うにんさんの<6542> と同様にランダムな順列を一つ追加で用意することになりますので、 2(n-1)回の乱数使用となります。 <6542> は直感的には、正しいかどうか私の頭では論理的には判断不能^_^; 先に全ての順列を求めていますので、 条件を満たすのは約1/3でしたから、残り2/3を隣同士の入替操作の繰返しで 条件を満たす順列に変換しています。 ランダムの順列をもう一つ咬ましていますので実際にはもう少し柔軟な操作です。 (隣同士とは限らないが自由な入替には程遠い) 総数2/3が総数1/3へ変換される過程で偏りがないか? 1/3側に相手のいない順列がないか? 1/3側に他より多くカウントされる順列がないか? うにんさん、大きなnで統計的に検証してみて下されば幸いです。 (論理的な証明は相当難しそうで、説明されても私には理解できないと思います。) |
|
|
||||||||||||
「#乱数(3)と#乱数(2)を使い分け」は、<6493>でやっています。 &c = #乱数(&n - &i + #COND(&R[&i]<&i, 1, 1, 0)) + 1 + &i - #COND(&R[&i]<&i, 1, 1, 0) n=100とか、いや50でも、実際には全ての可能な順列のうち「極一部」しか使わないので、 完全に均等である必要は全くないんですけどね。。。 「612345が通常の2倍の確率で生成」されたとしても、そもそも0.4%が0.8%になるとかいう レベルの話で、トランプの52になると1/10^67の確率。。。 どっか間違ってるかもしれないので<6553>で使ったのを貼っておきます。 最後のが指定席になってしまった場合が「部分的にやり直し」になってるのが いけないかも? 変数宣言 数値{&n} &n = 6 変数 数値{&結果[&n],&i,&s,&src,&dst,&t} for &i = 1,&n &結果[&i] = &i end *スタート位置のずらし-1 &s = #乱数(&n) for &i = 1, &n - 1 &src = #MOD(&i + &s, &n) + 1 &dst = #MOD(&src + #乱数(&n - &i + #COND(&結果[&src] = &src, 0, 1, 1)) + #COND(&結果[&src] = &src, 1, 1, 0) - 1, &n) + 1 &t = &結果[&src], &結果[&src] = &結果[&dst], &結果[&dst] = &t end if (&結果[&s + 1] = &s + 1) &結果[&s + 1] = &結果[#MOD(&s + &n - 1, &n) + 1], &結果[#MOD(&s + &n - 1, &n) + 1] = &s + 1 end これがなぜ駄目か別の理由付けを考えると、 例えば席1からはじめたとき1が入る確率が 0、0.1、0.2、〜、0.3だったとして、これを席nまで回した時、席1は常に0で 0.1、0.2、〜、0.3、0のよう同じ数字で全部を循環するわけではないから 縦の合計が均等にならないわけです。 |
|
|
||||||||||||
とりあえず、「逆指定席の処理」をしない場合ですが… ※未だに「逆指定席の処理」を理解していないことがバレバレ!(^^ゞ <序論> 調べたところ、n = 3〜5 位の場合には、 乱数の前回結果と今回結果が同じになる割合が高いですね。 そこで、前回結果と今回結果が同じ場合は再試行するようにしてみたところ、 意外と少ない再試行回数で済むようです。 ※ n の値が小さいほど再試行回数が増えます。 ※再試行回数は n の値が大きくなるほど、無視できるくらい少なくなるようです。 従って、「前回結果と今回結果が同じ場合は再試行する」というのは有効かもしれません。 <本論> その上で(まず、乱数値を発生させてからという意味)、 「逆指定席の処理」アルゴリズムを適用すれば、 皆様がお望みの乱数が得られるのではないかと勝手に想像してみました。(^^ゞ この場合の「逆指定席の処理」アルゴリズムは、 有限回で結果が出なければなりませんが、 もしも、有限回で結果が出ない場合には、 あらかじめ可否判定が必要になるだろうと思われます。 ※もちろん、有限回で結果が出るアルゴリズムであると証明されていれば、その必要はないのですが。 |
|
|
||||||||||||
要素4つで考えると1番目の値は1を除いた3通りです。2番目の値は1 番目に2が使われてれば3通りで、1番目に2以外が使われてれば1番目に 使われた数と2を除く2通りです。この2番目のように3通りと2通りの値 が入るのをプログラムしようとすると#乱数(3)と#乱数(2)を使い分けないと 結果の偏りがどうしても発生する気がします。 試行錯誤の経験では「ある条件なら乱数を新たに発生させて使用する」と か「部分的にやり直す」をすると結果の偏りに繋がるようです。 <6511> でコルネさんが示された > 条件を満たす順列の総数は、 > P(n)=(n!/2!)-(n!/3!)+(n!/4!)-(n!/5!)+ …… +((-1)^n)(n!/n!) の内容をプログラムに反映させる必要があるように思えます。 しかし、どう書くかが解りません。 で、要素すべての配列(#乱数(要素数)×・・・×#乱数(要素数))は結果 は偏り無く均等だから、そこから値の重複と順位=値を除けば目的とする配 列も偏り無く均等に取り出せるのではと思いました。ただn=100だと処理時 間が長過ぎます。 |
|
|
||||||||||||
>ループの初期値を1ではなく乱数で決めて一周 何となくよさそうな気がしたのですが、「座席を順番にループして入れる番号を決める」や 「番号を順番に入れる座席を決める」でループを乱数で初期値にしても均等になりませんでした。 席を順に埋めていくとすると、m番目の座席の数字を決めるのが 最初の場合:当然乱数で均等になる それ以外の場合:m-1番目の数字を決めるときm-1は使われないのでm-1が残っている確率が高い というのは変わらないので、やはりm番目の席にm-1が入る確率が高くなるようです。 &n=4で10000回試行すると、4123という上記の条件が4重に重なっている順列が 最大の1676回で、最小(3412)の819回の約2倍出現しました。 &n=5で10000回だと、51234が431回で、最小119の4倍弱。 &n=6だと順列パターンが265あるので20000回だとちょっと少なめですが、 612345が163回で最小は42回。といった具合です。 &n=5の場合、2番目だけを見ると1184−1006−879−925−1006で1が多くて4が少ない にしても、20%弱平均より多いだけですが、順列でみると増幅されてます。 |
|
|
||||||||||||
ネットのどこかにエラー音の(できれば「版権フリー」)WAVってありませんか? エラー発生時に鳴らすのですが、工場内でワイアレスバーコードリーダーを使っているので、 なるべく「やかましい」のが理想です。(^^; (女性の悲鳴やら火災報知器の音では困りますが・・・) 現在は(PC9801です9^^;)、内部スピーカーへハンダ付けしたコードから、アンプで 増幅してけたたましい「ビープ」音を鳴らしてます。(苦笑) だれかご存知の方がございましたら、是非に教えてください。>hidetakeさん (笑)ソウイウノモシッテルトミタ たこすぱげてぃ PS.#乱数、ディープな領域へ入ってますね。 |
|
|
||||||||||||
たゆーさん、こんにちは。 今回の乱数の話題は「ほっ!」にあるゲームが発端だったんですね。 実はゲームは昨晩拝見しました。(^^ゞ ところで、ゲーム:パズル関係では以下のページが面白いですよ。 すでにご存知のページかもしれませんね。(^^ゞ  ̄torito_ パズル遊びへの招待・オンライン版 ↓ http://torito.jp/puzzles/puzzle_asobi.html <追伸> 実はだいぶ昔のことですが、 「1−23.移動板パズル(15パズル)」を作ってみようと思ったことがありました。 しかし、桐で乱数を使った経験が無かったので、結局取り止めました。 本当の所は、並べ替えが可能な転倒の数を調べるのが面倒だったからなのですが…(^^ゞ |
|
Copyright (C) 2000 CGI Arkadia All rights reserved. Script written by Shintaro Wakayama. BBS-TypeN Ver.2 Preview4 remodel advice by hidetake |