ホームへ戻る|Data Base 桐 User Board|過去ログ一覧|検索|プロパティ |ほっ! |
▼過去ログ No131 |
書き込み数 : 6550件 |
|
|
||||||||||||
>え〜、これは「逆指定席」の処理がされてない普通の順列の生成ですね。 オオオッ〜、今までの経緯をよく読んでみたら、「逆指定席」というのが有ったのですね。 失礼しました。全然考えていませんでした。(^^ゞ >>次にも同じように正三面体のサイコロを振ります。 >は意味がなく、2回目は(手元にない番号が出たらその試行だけをすぐやりなおしてるので) >最初から正二面体のサイコロを使っても同じことです。 そうですね。乱数のタネを n〜 2 まで乱数を発生させれば足りますね。 ところで、n = 18 で 少し工夫すると3連単の馬券の買い目を作ることが出来そうです。 そんな馬券じゃ〜、到底当たりそうにありませんが…(^^ゞ |
|
|
||||||||||||
え〜、これは「逆指定席」の処理がされてない普通の順列の生成ですね。 んで、その場合&n!通りあるので、3!=3x2x1を見る通り、 >次にも同じように正三面体のサイコロを振ります。 は意味がなく、2回目は(手元にない番号が出たらその試行だけをすぐやりなおしてるので) 最初から正二面体のサイコロを使っても同じことです。 最近のでいうと、<6540>の for &i = 1, &n - 1 &c = #乱数(&n - &i + 1) + &i &t = &番号[&i], &番号[&i] = &番号[&c], &番号[&c] = &t が同様の処理です。 乱数の範囲が最初は1〜&nで、ループ毎に範囲の下の値が+1されていきます。 「別の場所に置いた札」が&番号[1]〜&番号[&i-1]で、 「手元の札」が&番号[&i]〜&番号[&n]にあたります。 |
|
|
||||||||||||
うにん さんの仰るとおり、<6542> の終わり2行は余分ですね、正しくない。 あわてんぼう のコルネであります ^_^; |
|
|
||||||||||||
>そこで、正三面体のサイコロを振ります。 ↑ これも例えです。 1、2、3の目しか出ないサイコロの意です。 |
|
|
||||||||||||
>1、n行の表作成:[連番:整数],[数値:整数] >For i=1 to n-1 >2、[連番]≠i and [数値]=null で絞込み >3、レコード数をカウントして乱数でレコードを選び、[数値]=i 代入 >4、絞込み解除 コルネさんの投稿をヒントにして、表( .tbl )を使わないで試してみました。 ※表( .tbl )代わりに、半角コンマの文字列を利用しました。 考え方は基本的にコルネさんと同じだと思いますが、一応簡単に説明します。 今までの経緯から、1 〜 3 までを &n = 3 の表現するとします。 まず、トランプを3枚用意して手元に置きます、もちろん「1」、「2」,「3」の札です。 そこで、正三面体のサイコロを振ります。 どれかの札の番号がゲット出来ますので、この札を抜き別の場所に置きます。 次にも同じように正三面体のサイコロを振ります。 if 幸運にも、手元の札にサイコロの目の札があれば、 この札を抜き別の場所に置きます。 else 運悪く、サイコロの目が、別の場所に置いた札と同じ番号ならば、 手元の札は2枚残っているので、 正二面体のサイコロ(これは例えです:勿論そのような物はありません)を振り、 左から数えて出た目の順番の手元の札を抜き別の場所に置きます。 ※ &n = 3 の場合は、手元の札は残り一枚ですので、実はこれで終わりです。 end 試した結果は以下の通りです(桐ver.8 sp6)。 もちろん、試行回数が少ないと出現回数がバラつきます。 ※桐の「#乱数」関数はタネの初期化を結構上手くしているような気がします。 ■100回試行の結果 result count 1,2,3 14 1,3,2 15 2,1,3 21 2,3,1 16 3,1,2 19 3,2,1 15 ■1000回試行の結果 result count 1,2,3 187 1,3,2 167 2,1,3 153 2,3,1 164 3,1,2 158 3,2,1 171 ■10000回試行の結果 result count 1,2,3 1624 1,3,2 1681 2,1,3 1669 2,3,1 1675 3,1,2 1712 3,2,1 1639 |
|
|
||||||||||||
><6540> の方法では、ランダムな順列を2つ作らなくとも、 >『*逆指定席に引っかかってたら隣と交換。』の操作を始める席番号を乱数で決めて一周すればよい。 それだと、最初のころのたこすぱさんのに戻ってしまいます。 隣と交換するのでは、どの席から操作を初めても「隣の席の番号」が入っている 確率が高くなってしまいます。 交換先を#乱数(&n-1)で選べばよさそうな気がするのですが、1つの生成中に毎回 同じ値を使うとなぜか2341のようなのが異常に高率になります。たぶん簡単な 原因なんでしょうけど? 毎回違う乱数にすればいいかは未検証ですが、乱数発生回数は最大でn-1+n/2になりますね。 |
|
|
||||||||||||
>>6542 ほぼ、最終回答でしょうか。 更にスッキリした解法は無いかな? |
|
|
||||||||||||
結果を表に取り込んで行集計かけてみたら、私のは不完全ですね。 <6526> は結果がばらつきます。n=3 で231が325件で312が675件発生。 <6533> は結果は平均するのですが、n=4で6種類の組み合わせしか発生しません。 必ず入れ替えようとすると要素が少ない場合に入れ替え要素が限られるみたいです。 条件違反の場合はスキップするようにしたら発生種類は増しましたが、 n が増えた時に検証できなくなります。 試行錯誤でなく、うにんさんのように論理的にやる必要がありますね。 |
|
|
||||||||||||
条件に反した順列を排除する操作の順番に依存して偏りが生じるようです。 n回の乱数発生で回答を出すには、 <6504>,<6508> の方法では、 For i=1 to n-1 のループの初期値を1ではなく乱数で決めて一周すればよい。 <6540> の方法では、ランダムな順列を2つ作らなくとも、 『*逆指定席に引っかかってたら隣と交換。』の操作を始める席番号を乱数で決めて一周すればよい。 |
|
|
||||||||||||
n回の乱数発生でデケタ |
|
|
||||||||||||
*やっとできた。<6530>の「要素数までの乱数を発生させ、ランダムな要素に入れる。」です。 *1000回試行してn=3で頻度が493:507、n=4だと299〜380、n=5で235〜279 変数宣言 数値{&n} &n = 5 変数 数値{&結果[&n],&番号[&n],&座席[&n],&i,&c,&t} for &i = 1,&n &番号[&i] = &i, &座席[&i]=&i end for &i = 1, &n - 1 &c = #乱数(&n - &i + 1) + &i &t = &番号[&i], &番号[&i] = &番号[&c], &番号[&c] = &t &c = #乱数(&n - &i + 1) + &i &t = &座席[&i], &座席[&i] = &座席[&c], &座席[&c] = &t end *逆指定席に引っかかってたら隣と交換。隣もランダムなので偏らないはず。 for &i = 1, &n if (&番号[&i] = &座席[&i]) &t = &座席[&i], &座席[&i] = &座席[#MOD(&i, &n) + 1], &座席[#MOD(&i, &n) + 1] = &t end end for &i = 1, &n &結果[&座席[&i]] = &番号[&i] end 条件なしのランダムな順列を2つ作って、番号と順番として使用する。 これで2(n-1)回の乱数で確実に生成できるでしょう。 後半のチェックと結果出力は1つのループにできるかな。 |
|
|
||||||||||||
「検証方法を考え」たら、順列自体はn=100だと100!のオーダーであるので、 統計を取るのは不可能なのであった^^;; 論理的にやるしかないですね。 |
|
|
||||||||||||
ドモ |
|
|
||||||||||||
「遠周りの馬鹿げた処理」といっても、データベースを使った効率よいやり方だと 私も思います^^; 何も考えずに乱数で並べてても、「逆指定席」についても3回に1回はクリアできる ことがわかったし:-) ただ、論理的には永遠にうまくいかない可能性もあるわけで、 その辺は表を使わないのと同じく「遊び」ということで。 |
|
|
||||||||||||
興味深く読ませて頂いておりました。 コルネさんの方法が確実に解け、かつエレガントな解法でしょう。 |
|
|
||||||||||||
拝啓 「たこすぱげてぃ」さん、こんばんは。 ONnojiです。※この掲示板では、色々な経緯からド・モ・ONnojiと自称しておりますが(^^ゞ >触った憶えも無い場所に、確かにチェックが入ってました。 >たったこれだけのことに費やした時間は・・・うぅっぅ、悲しい! 実は、今回のサンプルを調べるまで、私もチーともこうなる事は知っておりませんのでありました。 そういう意味で「たこすぱげてぃ」さんの今回のサンプルは私にはとても勉強になりました。 サンプルのご提示、ありがとうございます。>「たこすぱげてぃ」さん 誰でもドツボにはまりますよね。※もちろん私も何度も経験しています。(^^ゞ みんなで考えれば(調べれば)、今回のように近道になることもありますね。 そういう意味で、【多遊】さんがご用意された掲示板を活用される事が、実に有効だと思いました。 ありがとうございます。>【多遊】さん |
|
|
||||||||||||
No.6470で、既にたゆーさん wrote >そこで今までは、[番号][乱数]の項目のある作業表を準備しておき >事前に[番号]に「1〜10」までを設定しておきます >[乱数]項目を#乱数で置換後、[乱数]項目を並べ替えを行い >[番号]を利用するといった遠周りの馬鹿げた処理を行っていました 私がNo.6531で書いたのは、ここで云う「遠周りの馬鹿げた処理」その ものズバリでして・・・(汗) >なんとかイベントだけで(No.6470) それで、表を使わない方法を色々考えることにしたのでした。(^^;) 嗚呼、短期記憶力のかくの如き衰へを如何せん・・・・。 以下、No.6501からも引用して結びの語とするもの也。 >もう、プログラムするのも、限界かも知れない!? |
|
|
||||||||||||
別の方法です。ひたすらシャッフルさせます。 要素数3だと231、312、の2通りは、2つの要素を入れ替えると条件から 外れて無限ループになるので、要素数4以上の指定が必要です。 「よく切れている」という定義が難しいですが、「とにかくたくさん切れば良いのでは」という考えです。 変数宣言 固有,長整数{&シャッフル番号,&シャッフル数=100,&要素番号,&要素数=100} 変数宣言 固有,長整数{&SHUFFLE[&要素数],&スワップ先,&一時記憶} /* 重複ぜず、「順位<>値」になる数を初期設定 */ 繰り返し &要素番号=1,&要素数-1 代入 &SHUFFLE[&要素番号]=&要素番号+1 繰り返し終了 代入 &SHUFFLE[&要素数]=1 /* ひたすらシャッフル */ 繰り返し &シャッフル番号=1,&シャッフル数 繰り返し &要素番号=1,&要素数 繰り返し &スワップ先=#乱数(&要素数)+1 条件 (&スワップ先=&要素番号) 繰り返し継続 /* スワップ先が同一なら、スワップ先再発生 */ 条件 (&SHUFFLE[&スワップ先]=&要素番号) 繰り返し継続 /* スワップ先の値が「順位=値」なら、スワップ先再発生 */ 条件 (&スワップ先=&SHUFFLE[&要素番号]) 繰り返し継続 /* スワップ後の値が「順位=値」なら、スワップ先再発生 */ 繰り返し中止 繰り返し終了 代入 &一時記憶=&SHUFFLE[&要素番号],&SHUFFLE[&要素番号]=&SHUFFLE[&スワップ先],&SHUFFLE[&スワップ先]=&一時記憶 繰り返し終了 繰り返し終了 |
|
|
||||||||||||
<6502>以外のは「各席の番号の比率が均等」にすらなってないので、悲しげさんのように 1席1行ので行集計して簡単にチェックできましたが、数列が均等かどうかはこれじゃ だめなので検証方法を考えます。(文字列化したのをそのまま項目値にすればいいですかね) <6529>だと逆向きなのと1/2で選択するだけなので、駄目そうな気がする。。。つまり、 <6517>の確実にn-1回の乱数生成で終わる方法だと、例えば席を順に埋めていく 場合「2番の席には1が入る確率が高い」しわよせが後方に伝播して(?)、 上記の行集計でチェックすると最後の席の平均値が期待値より大分大きくなっています。 「(最初に決める)1番の席は確実に均等に入っている」ので逆順のと選択でうまくいくには 「最後の席も均等」でないとだめでしょう。<6517>やコルネさんの方法では基本的に 最後の席は自動的に決まってしまうわけなので? |
|
|
||||||||||||
どうも私だけ非数学的っつーか、文系的なノリで浮いていますが(^^;)、 表を使って生成させるのであれば、もっと簡単な方法があります。 はるか昔、レコードをランダムに並べ替える必要があって(多分にゲーム っぽいノリでしたが)その時に採用したやり方です。 それは、ある数値型項目を乱数で置換し、次にその項目で以て整列させる というものですが、この時、元々の行番号データからすると(重複のない 形で)ランダムに並んでいることになります。 と云う訳で、ちょっと試してみました。 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 var 長整数{&i,&n=100} 繰り返し キー入力 プロンプト="乱数の n を入力" \ ,モード=確定,上書き=する,初期値=&n,終了状態=&実行リターン,&n cond(&n>1) 繰り返し中止 確認 "n の値は 2以上で試してネ!" 繰り返し終了 var 長整数{&p[&n]} 表 "乱数.tbl" *この表には[カウンタ]なるカウンタ項目があるとする* *項目[乱数]のデータ型は数値型としておくことにする* 行削除 *,圧縮 繰り返し &i=1,&n *行追加 [乱数]=#乱数(&n) *行追加 [乱数]=#乱数(32767) 行追加 [乱数]=#乱数(1) 繰り返し終了 並べ替え 条件名="乱数順" 繰り返し( .not #EOF) &p[#行番号]=[カウンタ] ジャンプ 行番号=+1 繰り返し終了 表形式編集 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 どうです、超シンプルざましょ? しかも、前述したやり方に比べると(やり直しが無い分)格段に速い。 ついでに云えば、nの上限も殆ど無制限。 但し、厳密に云うと、微妙に「ある傾向」が発生しています。 どういうことかと云うと、例えば n=100 くらいだと[乱数]項目に少なか らぬ重複が発生しますから、乱数順に並べた際に、重複データに限り行 番号の若い順に並んでしまうと云う「傾向」です。 この「傾向」を極力避けるためには、n を大きくする必要がありまして、 一番大きいのは#乱数関数の仕様上限である「32767」がいいんじゃないか などと考えました。が、次の瞬間、n を「1」にする方が妥当なことに気が 付きました。凄いですよ〜、小数点16〜17位くらいまで展開されます。 だから100行や1000行くらいだと、重複はまず無視できるだろう、と。(^^)v |
|
|
||||||||||||
ちなみに「均等に出現」は私が勝手に追加した条件です。 シャッフルという意味からは妥当な追加だと思います。 (実用的には完全に均等である必要は低いが問題としては面白くなるでしょう。 たんなる順列を均等に生成するのは、プログラムのテストに必要ということで Microsoftのサイトにも解説があります) 「各席の番号の比率が均等」なだけなら<6502>の方法でいいのですが、これだと n=4の場合9通りのうち3通りしか出現しません。 トランプとか麻雀のシャッフルになら使える気がしますが、たゆーさんの 「入れ替えパズル」に使うととてもまずい順列だけ出てきますね。 T.Samuraさんのを読み直して、「要素数までの乱数を発生させ、 ランダムな要素に入れる。」にしたら解決しそうな気がしました。 |
|
|
||||||||||||
なるほど、ランダムに抽出→バラバラに出現のみではなく、均等に出現、でしたか それでは回答をドゾ 1、<6504> <6508> を行う→順列Aを抽出 2、同様の処理を逆向きに行う(i=nからi=2)→順列Bを抽出 3、乱数で、順列Aと順列Bの一方を選ぶ |
|
|
||||||||||||
現物を見てませんが、文章を読む限り悲しげさんのと同じコンセプトだと思います。 要素数3で実験すると、231と312が1:2か2:1の頻度になるでしょう。 実際はもっと要素数が多いので差は少なくなるし実用上問題ないのですが、 全ての可能な乱数列を均等に発生する方法を模索しています。 |
|
|
||||||||||||
>フォームの属性の編集対象表タブ内 > "編集中止の確認" > on/offの違いでは? な、なるほどぅ… 触った憶えも無い場所に、確かにチェックが入ってました。 たったこれだけのことに費やした時間は・・・うぅっぅ、悲しい! ケントさん、ONnojiさん、ありがとうございました。 今後ともよろくしくお願い致します。 しかし、およそ四、五年ぶりの桐にあたふたしまくっております。 たこすぱげてぃ |
|
|
||||||||||||
長いので「ほっ!」に載せました。 要素数までの乱数を発生させ、要素の初めから入れる。 要素番号と値が同じなら入れなおす。 これまで発生させた要素と同じ値なら入れなおす。 やり直しが限度を超えたら最初からやり直す。 以上を力技で実行してます。100件なら問題ない速度なので実用になると思います。 |
|
|
||||||||||||
二つのフォームで一ヶ所違いが見つかりました。 <閉じる.wfm> フォームのオブジェクトの属性の[編集対象表]タブの、 [編集中止の確認]チェックボックスがオフの時に、 ESCキーで直ちに閉じてしまうようです。 <閉じない.wfm> [編集中止の確認]チェックボックスがオンの時には、 エディタを終了するだけでフォームは閉じられないようです。 |
|
|
||||||||||||
お久しぶりです。 フォームの属性の編集対象表タブ内 "編集中止の確認" on/offの違いでは? V9sp1で動作確認 |
|
|
||||||||||||
ONnojiさん、こんにちわ。 >「ほっ!」に再現するサンプルを置いていただいたらいかがでしょうか??? > ↓ >http://www2u.biglobe.ne.jp/~s_tanaka/bbs/ho/cbbs.cgi お言葉に甘えて、サンプルをアップしてみました。 お試しいただければ、幸いです。 たこすぱげてぃ |
|
|
||||||||||||
>(1)のようにエディタの中に居る時にESCキーを押すと、エディタを終了するのが普通だろうと思います。 ちょっと気になったのですが… 更新モードの場合でも… フォーカスがテキストオブジェクト、またはグループ項目オブジェクトにある場合は、 ESCキーを押すとエディタが終了しますが、 それ以外のオブジェクト(例えばコマンドボタン)がフォーカスされている場合は、 フォームが閉じられると思いますが、 ウ〜ン、やっぱり外しているでしょうね。(^^ゞ |
|
|
||||||||||||
>1)更新モード時、あるフォームでは、[ESC]を押すと更新モードが表示モードへ切り替わり、フォームは閉じません。 > >2)しかし、別のあるフォームでは、[ESC]を押下した瞬間に、更新モードであってもフォームが閉じます。 (1)のようにエディタの中に居る時にESCキーを押すと、エディタを終了するのが普通だろうと思います。 外しているかもしれませんが… 押した瞬間にフォームが閉じるという表現をされているので、 以下は見当ハズレだと思いますが… ESCキーを押しつづけると、ESCキーがリピートしますので、やはりフォームが閉じるはずですが… しかし、瞬間という事ですから、やはりキーのリピートという意味ではありませんよね。(^^ゞ 当方もちょっと試してみましたが、再現が困難です。 「ほっ!」に再現するサンプルを置いていただいたらいかがでしょうか??? ↓ http://www2u.biglobe.ne.jp/~s_tanaka/bbs/ho/cbbs.cgi |
|
|
||||||||||||
この問題、色々と面白いですね。 > <6517> re:#乱数 /うにん > となり、席1だけが両方の場合に入る可能性があって、他より確率が高くなります。 うにん さん へ、 理解できない^_^; もう少し詳しくお願いできますでしょうか? m(__)m |
|
|
||||||||||||
何の意識もなく作った複数のフォームで、[オプション]-[実行コマンド]-[ESCキー]の挙動 の違いに悩んでおります。 [ESCキー]には[閉じる]ボタンが指定されており、[閉じる]ボタンの内容は[コマンドボタン] に機能名[閉じる](パラメータはなし)が指定されています。 挙動の違い> 1)更新モード時、あるフォームでは、[ESC]を押すと更新モードが表示モードへ切り替わり、 フォームは閉じません。(こっちが本来の仕様?) 2)しかし、別のあるフォームでは、[ESC]を押下した瞬間に、更新モードであってもフォームが 閉じます。 もちろん、イベントの類は一切ありません。(というか、検証する為にすべて排除しました) 別々の挙動をするフォームを1つのテキストオブジェクトと[閉じる]ボタンオブジェクトだけ にして、様々なオブジェクトの属性値を比べてみても、違いが分からんのであります。 (既に6時間以上時間を費やしてしまった。(^^;) なぜでしょう? ちなみにV8sp6です(^^; たこすぱげてぃ ここ二週間くらいで、まったく同じ環境で作ったフォームです。 [ESC]を押下した瞬間に、更新モードであっても、即時フォームを閉じたい状況で、不意に フォームによって別々の挙動をしていることに気が付きました。 様々なフォームを調べたところ、現在、フォームの約7割が1)であり、3割が2)になってます。 ・・・一般的な質問かどうか悩んだ末、取り合えずこちらへ |
|
|
||||||||||||
横から失礼します。途中まで考えた内容ですが。 乱数というよりシャッフルですね。ソートの逆というか重複しない乱数の列が欲しいわけで。 ソートは大小という判定がはっきりしてますが、シャッフルは定義が難しいですね。 十分な行数の表の各行に乱数を入れて並べ替え単一化して連番を振り並べ替え解除したのち、 定義行を絞り込み「順位=値」を排除すればどうかなあと考えてます。 |
|
|
||||||||||||
色々考えたのですが、「1番目から順に入れる数字を決める」とか 「1から順に入れる場所を決める」では、すべての順列を均等に生成する ことはできないことがわかりました。 例えば、最初に番号1を入れる場所は2〜nから乱数で選べば均等にできます。 しかし、その次の番号2を入れる段になって、「残った場所に乱数で均等に入れる」と、 番号1が席2に入ってる場合(1/(n-1)の確率)、残りのn-1通りから選ぶ それ以外の場合((n-2)/(n-1)の確率)、席2と1の入ってる席(3〜n)を除いてn-2通りから選ぶ となり、席1だけが両方の場合に入る可能性があって、他より確率が高くなります。 1/(n-1) * 1/(n-1) + (n-2)/(n-1) * 1/(n-2) = 1/(n-1)^2 + 1/(n-1) 最後の1つの座る席がない場合の調整が何かしら入るとしても、調整不要な場合が ありえるので、だめですし。 |
|
|
||||||||||||
ドモ |
|
|
||||||||||||
コルネさんこんばんは この掲示板に、ご投稿いただいてます方々は・・・・・ 話は1ヶ月くらい遡りますが「例の8月13日」です、(あまり詳しくは覚えてません) >ここが休止したら「Data Base 桐 User Board」もありますよ と、紹介いただきましたネ、その後半部分に >もし、レベルが高ければ・・・(言葉は違うかも知れませんが) と、記載されてたような記憶がありますが ここも、そんなにレベルの高いお話ばかりではないですよ それより、「コルネさん」が書かれてる内容がはるかに、私には・・・・・ >この時間に既に酔っぱらってます。 ・・・ >済みません、酔いが醒めた ^_^; こんな話をたくさん書いてくださいね。ちなみに「コルネ」で、検索してみました > <1242> かものページって何処ですか?/コルネ ■2000年08月14日 月曜日 13時26分00秒 もう5年のお付き合いじゃないですか。今後ともよろしくお願いいたします |
|
|
||||||||||||
桐のイベント(ヘルプより)で、「キーダウン・システムキーダウン」等がありますが・・・・ は、後にして さて、キーボードの話です。 今まで日常利用するメインの(自作)パソコンに、昔の古いパソコンに付属していた 「NEC」製を接続していました。それを「SOTEC」のキーボーに変更してみました 通常(古いNEC製等では)ファンクションキーが最上段にありますが、その「SOTEC」の キーボードには、まだその上に、丸いボタンが15個あります 例えば、「インターネットへ接続」「前後の画面へ移動」「ボリュームの大小」等が ワンタッチで行えます やはりメーカ品は、それなりの機能をつけてるなと思いながら、つい「インターネットへ 接続」ボタンを押したら、つながっていきました。 しかも「IE」でなくブラウザの標準に設定している「Sleipnir」が起動されました。 すごい・・・!とも思いましたが、ここから本題です >キーボードの、どのキーを押したか? を、調べたいのに >「キーダウン・システムキーダウン」等がありますが・・・・ で、調べられるのでしょうか。 ちなみに、桐では「キーダウン・システムキーダウン」と記載されてますが どう見てもキーボードのそれは「ボタン」です ただ、この辺がうまく行けばフォーム上でマウスの「スクロール機能(コロコロボタン)」が 効かないのを代替できないかとおもったしだいです それより、なぜ、標準設定「IE」でないブラウザが起動したのでしょう? ちなみにメールAPは起動できませんでした |
|
|
||||||||||||
>悲しげさんのは、乱数のパラメータが常に&nなので、結構途中でのやり直しも >多いはずなんですが、実際に実行してみると全然問題ない時間で終わります。 御意。 やり直しも含めた実際の繰り返し数を、以下の記述で調べてみました。 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 var 長整数{&f=1,&i,&j=0,&r,&n=100},文字列{&乱数s,&乱数s群} 繰り返し キー入力 プロンプト="乱数の n を入力" \ ,モード=確定,上書き=する,初期値=&n,終了状態=&実行リターン,&n if(&n<2 .or &n>1000) 確認 "n の値は 2〜1000 の間くらいで試してネ!" else 繰り返し中止 end 繰り返し終了 var 長整数{&p[&n]} 繰り返し(&f=1) &i=1,&乱数s群="",&f=0 繰り返し &r=#乱数(&n)+1,&乱数s=#str(&r),&j=&j+1 if(#対応番号(&乱数s群,&乱数s)<1) if(&i=&n) /*最後*/ if(&r=&n) 確認 "最後がぶつかったのでやり直し(^^;)" &f=1 else &乱数s群=&乱数s群+","+&乱数s &p[&i]=&r end 繰り返し中止 else if(&i<>&r) /*逆指定席*/ &乱数s群=&乱数s群+","+&乱数s &p[&i]=&r &i=&i+1 end *if(#文字数(&乱数s群)>3990) */*1010〜1020件くらいが限度か?*/ *確認 "文字数over("+#str(&i)+"件くらいで)" *終了 *end end 繰り返し終了 *&乱数s群=#sstr(&乱数s群,2) /*最初がヌルなので*/ 繰り返し終了 確認 "結果を表に割り付けてみて確認しませう(n="+#str(&n)+"で繰返"+#str(&j)+"回)" *(以下略) 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 実際に発生する繰り返しは、n=100で中央値500回くらいみたいです。 n=10なら20回くらいかな? さすがにn=1000だと7000回とかになって 遅くなりましたけどね。(^^;) ちなみに「最後がぶつかる」確率は当然ながら極めて低いです(nが大 きくなればなるほど)。 |
|
|
||||||||||||
「うまく行かない場合にやりなおし」は、現実的には全く問題ないと思います。 悲しげさんのは、乱数のパラメータが常に&nなので、結構途中でのやり直しも 多いはずなんですが、実際に実行してみると全然問題ない時間で終わります。 私がたこさんの変数方式に乗っかったのは、文字列だと入れ替えをうまくする方法を 思いつかなかったので。。。 コルネさんの式は私の推測と同じでしたので、やはり P(n+1)=P(n)*(n+1)+((-1)^n) となって、P(3)=2=3!/3なのでn!の1/3倍より多くなりますね。 |
|
|
||||||||||||
> n が大きくなると、条件を満たした数列の個数は、 > n!の1/3倍ではなくゼロ倍に近づく気がします。 これは違っていたようです。 済みません、酔いが醒めた ^_^; 条件を満たす順列の総数は、 P(n)=(n!/2!)-(n!/3!)+(n!/4!)-(n!/5!)+ …… +((-1)^n)(n!/n!) となります。 |
|
|
||||||||||||
「天和」のことじゃなかったんですね。(^^;)(^^;) つまり「逆指定席」とでも云うか、3の番号札を引いた人は 必ず3番以外の席に座れ、っつー訳で。(^^;) で、問題となるのは、たまたま最後の番号札nを引いた人に 残されていた席がn番しか無かった場合・・・ですよね? う〜ん、この場合に限り「ご破算」として、再度乱数生成を やり直す、ってのは駄目なんでしょうか? そんなに時間は かからないですし。 折角だから、No.6474の方式(配列変数ではなく、カンマ区切 り文字列格納)で試してみました。 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 var 長整数{&f=1,&i,&r,&n=100},文字列{&乱数s,&乱数s群} 繰り返し キー入力 プロンプト="乱数の n を入力" \ ,モード=確定,上書き=する,初期値=&n,終了状態=&実行リターン,&n if(&n<2 .or &n>1000) 確認 "n の値は 2〜1000 の間くらいで試してネ!" else 繰り返し中止 end 繰り返し終了 繰り返し(&f=1) &i=1,&乱数s群="",&f=0 繰り返し &r=#乱数(&n)+1,&乱数s=#str(&r) if(#対応番号(&乱数s群,&乱数s)<1) if(&i=&n) /*最後*/ if(&r=&n) 確認 "最後が重なったので乱数の作り直し(^^;)" &f=1 else &乱数s群=&乱数s群+","+&乱数s end 繰り返し中止 else if(&i<>&r) /*逆指定席*/ &乱数s群=&乱数s群+","+&乱数s &i=&i+1 end *if(#文字数(&乱数s群)>3990) */*1010〜1020件くらいが限度か?*/ *確認 "文字数over("+#str(&i)+"件くらいで)" *終了 *end end 繰り返し終了 &乱数s群=#sstr(&乱数s群,2) /*最初がヌルなので*/ 繰り返し終了 確認 "結果を表に割り付けてみて確認しませう" 表 "乱数.tbl" 行削除 *,圧縮 繰り返し &i=1,&n 行追加 [乱数]=#num(#対応文字列(&乱数s群,&i)),[tmp]=&i 繰り返し終了 絞り込み 重複行=2,{[乱数]} cond(&選択件数>0) 確認 "重複件数="+#str(&選択件数)+"件" 解除 絞り込み [乱数]=[tmp] cond(&選択件数>0) 確認 "番号と席番が同一なのは"+#str(&選択件数)+"件" 解除 並べ替え {[乱数]昇順} 表形式編集 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 また外したかな? |
|
|
||||||||||||
この問題は、規則性を記述したり・適合数列の総数を求めたり・任意数列の適否を判定 したりは、数学の群論で扱います。スマートな方法もあると思います。 ただ、『具体的にランダムな適合数列を抽出(有限時間内に)』するには、 n-1回以上乱数を使用する必要があると思います。 また相当に煩雑な作業となります。 もともとデータベースが持っているフィルタ機能やカウント機能を利用して ランダムな適合数列を抽出するのは、理にかなった方法と思います。 桐の掲示板に適した問題であった(^_^) この時間に既に酔っぱらってます。 外していたらゴメンなさい。 |
|
|
||||||||||||
終端処理を忘れていました。 雑で済みません。 i=n-1 の時 連番n行の[数値]がnullならn行の[数値]=i 直ぐ気付いたのですが、プールへ行っていました。済みません。 n が大きくなると、条件を満たした数列の個数は、 n!の1/3倍ではなくゼロ倍に近づく気がします。 |
|
|
||||||||||||
プログラムを作成中、途中で変数や画面の確認をしたくなるときがありますが >確認・・・・ と、すると画面の中央におおきく表示され肝心の場所が見えなかったり マウスで動かしたり面倒ですね そのようなとき >メニュー2 &秒,&秒, (1,1),"","" または、 >メニュー2 &秒,&秒, (1,1),"",表示したい変数 等にしておけば、画面も見えるし、設定した変数も確認できます 邪魔にならないところでご利用ください |
|
|
||||||||||||
あ、大場か。空いてる場所が数字の番号かもしれんのかT_T |
|
|
||||||||||||
ゼロに近づくって、解がなくなるってことですか? 順番をそのままで1〜n-1ずらすだけでn-1個は解があるので、それはありえないし? やっとすっきりするかと思って期待したのですが、これは「1番目から順に入る数字を 決める」代りに「1から順に入れる場所を決めている」だけで、あまり代わり映えしませんね。 ループがn-1回しかないので、nを入れる場所がnしか空いてない場合ができてしまいます。 そこで思いついたのは、n個のを求めるときn+1行で処理して、最後にn+1番目に 何か入っていたら、それを空いている場所に移せばいい?? |
|
|
||||||||||||
nが大きくなればn!の1/3よりも急激にゼロに近づきます。 有限時間内で確実に回答を出すには、 1、n行の表作成:[連番:整数],[数値:整数] For i=1 to n-1 2、[連番]≠i and [数値]=null で絞込み 3、レコード数をカウントして乱数でレコードを選び、[数値]=i 代入 4、絞込み解除 |
|
|
||||||||||||
>記憶が・・・もう、プログラムするのも、限界かも知れない!? me too. |
|
|
||||||||||||
そうです、!は階乗です。で、ファイルメーカーには、階乗を求める関数があるのです! (しかも指定により有効桁数400桁まで計算できます)負けてるぞ〜>桐 入れ替え法で 1)自分より後ろのから乱数で選んで入れ替える 2)すでに入れ替えた分はそのままにする とすると、乱数の発生回数が半分で済みます。(奇数個の場合は、最後に最後の1つを ランダムなものと入れ替えればよい) そのかわり「n番目の数がmの場合m番目が必ずn」という偏ったものになります。 |
|
|
||||||||||||
この年になって >高校数学あたりでやる『順列と組合せ』の中に出てくる「階乗」だと思います。 とは・・恐れ入りました。 ところで、 >むかしの童話?かなにかで「世界一短い手紙」みたいなタイトルで >出した手紙が「!」で、返信が「?」のような話を見たことがありますが、 ちゃんと紹介されてました http://www.geocities.co.jp/Bookend-Ohgai/7515/TXT/000-2000_07/000713.htm 記憶が・・・もう、プログラムするのも、限界かも知れない!? |
|
Copyright (C) 2000 CGI Arkadia All rights reserved. Script written by Shintaro Wakayama. BBS-TypeN Ver.2 Preview4 remodel advice by hidetake |