SRC質問掲示板Mk2
(現在 過去ログ105 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■18986 / inTopicNo.1)  条件式が無条件で満たされる?
  
□投稿者/ 匿名希望 -(2006/08/13(Sun) 00:48:08) [ID:2eMbhZ9o]
    ↓条件式ここから

    A <> Random(10)
    (A Like Random(10)) = 0
    InStr(A,Random(10)) = 0

    ↑条件式ここまで

    「1≦A≦10」
    という条件下でIf文に上記の条件式を指定して処理を試みましたが、
    全て失敗に終わりました。
    具体的には条件が満たされているものとして処理されてしまったのです。

    今回やりたいことは
    「1ずつ増やしていく数値と乱数を比較してその数値が違っていたら特定の処理を行う」
    というものです。

    上記の条件式のAは「1ずつ増やしていく数値」に当たります。
引用返信/返信 削除キー/
■18987 / inTopicNo.2)  Re[1]: 条件式が無条件で満たされる?
□投稿者/ 中箱 -(2006/08/13(Sun) 02:08:40) [ID:7vERprld]
    2006/08/13(Sun) 02:33:52 編集(投稿者)
    2006/08/13(Sun) 02:28:12 編集(投稿者)

    #コマンド関連のミスを計二箇所修正

    どうも、中箱です


    >「1≦A≦10」
    >という条件下でIf文に上記の条件式を指定して処理を試みましたが、
    >全て失敗に終わりました。

    ええと、何回試したのでしょうか?
    上の条件式を満たす確率は単純に考えて9/10、90%ですので、
    10回ぐらい試しただけでは、全ての試行において条件を満たしてしまう事は普通に起こります。


    こちらでも以下のような感じで試してみましたが、
    条件式が満たされないことがあるのは確認できました。

    #---ここから
    for A = 1 to 10
    #Aを変化

    for i = 1 to 100
    #100回ぐらい試す

    if (A <> Random(10)) then //条件式1
    #if ((A Like Random(10)) = 0) then //条件式2
    #if (InStr(A,Random(10)) = 0) then //条件式3
    #試したい条件式でどうぞ

    else
    Talk システム
    $(A)、$(i)。
    end
    #条件を満たさなかった場合、(確率的には10%)
    #Aの値と試した回数(i)を表示。

    i = 100
    #条件を満たさない場合がある、ことを調べるのが目的なので、無駄な処理は飛ばす
    endif
    next
    next
    #---ここまで



    なお、念のため書いておきますが、
    Random()の値は当然毎回違う値ですので(そのためのRandom関数ですから・・)
     if Random(2) = 1 then
     変数1 = 1
     elseif Random(2) = 2 then
     変数1 = 1
     endif

     if Random(2) = 1 then
     変数1 = 1
     else
     変数1 = 1
     endif
    とは全く違うものです。
    前者は必ずしも「変数1=1」となるわけではありませんが、後者は必ず「変数1=1」となります。
    こちらの杞憂でしたらすいません。


    >「1ずつ増やしていく数値と乱数を比較してその数値が違っていたら特定の処理を行う」
    この文ですと「乱数」の意味する所が曖昧で、分かりにくいように思います。
    具体的には、
    数値を増やしていく間、乱数の値は固定されているのか、それとも比較のたびに乱数を呼びなおすのか、ですが。(穿ちすぎでしょうか・・?)


    では。
引用返信/返信 削除キー/
■18988 / inTopicNo.3)  Re[2]: 条件式が無条件で満たされる?
□投稿者/ 匿名希望 -(2006/08/13(Sun) 02:50:18) [ID:2eMbhZ9o]
    ↓同一文字列除外処理ここから

    For バケラッタ番号 = 1 To 5400
    If バケラッタ順番 = 0 Then
    Incr バケラッタ順番
    オリジナルバケラッタ[バケラッタ順番] = バケラッタ名[バケラッタ番号]
    ElseIf バケラッタ順番 >= 1 Then
    For バケラッタワルツ = 1 To バケラッタ順番
    If InStr(オリジナルバケラッタ[バケラッタワルツ],バケラッタ名[バケラッタ番号]) = 0 Then
    Incr バケラッタ順番
    オリジナルバケラッタ[バケラッタ順番] = バケラッタ名[バケラッタ番号]
    Break
    EndIf
    Next
    EndIf
    Next

    ↑同一文字列除外処理ここまで

    変数の役割はこうです。

    バケラッタ名(配列)…………………ランダムな文字列(親記事ではRandom関数で代用)
    オリジナルバケラッタ(配列)………同一の文字列が算出された物を除いたオリジナルの文字列郡(現状では同一文字列も投入されてしまう)
    バケラッタ順番…………………………オリジナルの配列用の番号

    実際に使用している処理はこのようになっています。

    具体的には
    「算出された文字列をそれまでに現れた文字列と比較し、少しでも違うならば別な変数に保存する」
    という処理です。

    これまでにも
    「文字列をいくつか算出した後になぜか同じ文字列が算出される」
    という現象を何度も確認しています。
    周期は長いもののRandom関数ならともかく
    まったくのアトランダムで算出されている文字列が
    750回程度回った後で同じになるのは変です。
    この数字は多いとお思いでしょうが実は約400万通り以上の文字列を算出する方法があります。
    この方法を使っても750回程度でループして同じ文字列が出ます。
    これを解消する為に同じ文字列をカットしようとしたのですが、失敗です。

    私はOpen、Print、Closeの各コマンドを使っているので結果が一目瞭然です。
    オリジナルバケラッタ」の内容を全て書き出す処理になっているのですが、
    なぜか同じ文字列まで書き出されてしまいます。

    凡ミスをしていたらすみません。

    どのような条件式を使えばいいのでしょうか。
引用返信/返信 削除キー/
■18993 / inTopicNo.4)  条件式の問題ではないようです
□投稿者/ 中箱 -(2006/08/13(Sun) 13:51:34) [ID:7vERprld]
    2006/08/13(Sun) 14:33:42 編集(投稿者)

    #所々文章を手直し

    凡ミスなどではなく、同一文字列処理を行うプロセスに関しての考え方に大きな間違いがあるようです。これでは同一文字列除外処理になっていません。


    >「算出された文字列をそれまでに現れた文字列と比較し、少しでも違うならば別な変数に保存する」
    ではなく、
    「算出された文字列をそれまでに現れた文字列と比較し、どれか一つの文字列とさえ違っていれば別な変数に保存する」
    となっています。
    (つまり、全ての"バケラッタ名"が同じ文字列であるような時にしか意味がありません)


    同一文字列処理をする、ということは
    「算出された文字列が、それまでに現れた文字列のどれとも完全一致する事が無ければ別な変数に保存する」
    と言い換えれば少しは分かりやすいでしょうか?
    今のものとどう違うのか考えてみてください。



    以下は蛇足かとも思いますが、
    "なぜ正常に動作しないのか"についての追求が甘かったのでは、と感じます。
    大量のデータで試して上手く動かなかった(同一文字列を削除できなかった)のであれば、
     ・少量で、検証するために必要最低限に単純なデータで試す。
     ・やりたい処理を行うためには、この内容・考え方で本当に合っているのかどうかの再確認。
     ・変数の挙動が自分の本来意図したものとなっているかどうかの検証(プロセスのあちこちにTalkコマンドを入れる、などして)。

    は必要だと思います。
    (まあ、これらをやれば必ず自分で見つけられる、と言うものではありませんが・・
     いずれも実行済みでしたらすいません)


    ところで、
    >「文字列をいくつか算出した後になぜか同じ文字列が算出される」
    関連についてはただの状況説明で、
    こちらには一切の回答を求めていないということでよろしいのですよね?



    今一度、処理の方法について考え直してみてください。
    プロセスについての考え方をもっと詳しく、もしくは、具体的な方法を、という事であれば言ってください。

    では
引用返信/返信 削除キー/
■18998 / inTopicNo.5)  Re[4]: 条件式の問題ではないようです
□投稿者/ 匿名希望 -(2006/08/13(Sun) 23:57:17) [ID:2eMbhZ9o]
    一生懸命考えたのですが、具体的な方法が思いつきませんでした。
    優しく教えてください。お願いします。
引用返信/返信 削除キー/
■19000 / inTopicNo.6)  Re[5]: 条件式の問題ではないようです
□投稿者/ 中箱 -(2006/08/14(Mon) 03:02:18) [ID:7vERprld]
    2006/08/14(Mon) 03:06:02 編集(投稿者)

    んん・・どこから説明が必要でしょうか?

     ・処理が間違っている事が分からない
     ・処理のどこが間違っているか分からない
     ・間違っている場所は分かるが、どのように直せばいいか分からない
    など、分からない具合によって説明の量が大きく変わってくるので
    正直困るのですが・・・・


    とりあえず、No.18988で提示された同一文字列除外処理の間違いについてから、間違っている点を中心に書きます。

    優しく、になるかどうか自信はさっぱりですが、できるだけ丁寧に、とは。
    その分確実に長くなりますけど。


    =================================================
    No.18988の同一文字列除外処理は以下のようなものでした。

    (変数名がバケバケバケラッタしていたので、
     思わず{このレスの間バケラッタ以外喋らない俺罰ゲーム!}なんて血迷った事を口走りそうに・・・はどうでもよくて、と、いや失礼。

     変数名が個人的に見辛いと思ったので適当に短くしてます。
     人それぞれかと思いますのでこれはこれで見辛かったらすいません。変数名以外、内容は変えておりません)

    #==========

    For バ番号 = 1 To 5400 //----------------※その1
      If バ順 = 0 Then //----------------※その2
        Incr バ順
        オリバケ[バ順] = バケ名[バ番号]
        #最初の文字列 "バケ名[1]" はそのまま "オリバケ[1]" に。
      ElseIf バ順 >= 1 Then //-------------※その3

    #------問題部分ここから-------------------※その4
        For ワルツ = 1 To バ順 //--------*1
        #それまでに現れた文字列と順番に比較していく

          If InStr(オリバケ[ワルツ],バケ名[バ番号]) = 0 Then
          Incr バ順
          オリバケ[バ順] = バケ名[バ番号]
          Break
          EndIf
        Next
    #------問題部分ここまで
      EndIf
    Next

    #==========


    ※その1
    処理前の文字列数=バケラッタ名(バケ名) の個数だけ繰り返せばいいのですから、文字列の数以上は不要でしょう。
    指定した配列の要素数が返って来るCount関数を使い、
    "for バ番号 = 1 to Count(バケ名)"
    とすれば無駄が省けます。


    ※その2
    このifコマンドの部分はまとめられると思います。
    まあ色々やりかたはあるかと思いますが。間違っているわけでもありませんし。
    まとめた方が記述が少し省略でき、多少処理が早くなりそう、という程度で。

    ※その3
    Elseifではなく、単にElseで良いと思います。
    バ番号は最低0なので、最初以外は必ず "バ順 >= 1" という条件を満たすのですから。
    まあ、間違っているわけでも(以下略

    そもそも※その2と合わせてこのif自体も省けるでしょうし。

    省き方は、最初に「バ順=1」としておき、
    問題部分における「Incr バ順」 と、オリバケへの代入処理 の順番を入れ替えれば済みます。
    (順を追って確認していけば、ifを使った場合と結果が同じになることが分かるはずです)

    #-------------
    バ順 = 1
    For バ番号 = 1 To Count(バケ名)
      For ワルツ = 1 To バ順
        If InStr(オリバケ[ワルツ],バケ名[バ番号]) = 0 Then
          オリバケ[バ順] = バケ名[バ番号]
          Incr バ順
          Break
        EndIf
      Next
    Next
    #--------------
    まあ、これでは同一文字列除外処理にはならないままですが。



    ※その4
    本題で、問題の部分です。
    詳しくは以下に。


    ==========================

    上の同一文字列除外処理が上手く動かない事の実例を示します。

    まず例えば、
     バケ名[1]=あああ
     バケ名[2]=いいい
     バケ名[3]=いいい
    だった場合を考えてみます。

    すると、まず
     オリバケ[1]=あああ
     オリバケ[2]=いいい
    となります。ここまでの動作には問題ありません。

    問題は、 "バ番号=3" の時です。
      (この時 "バ順=2" になっています。(順を追って確認してみてください))
    ・バ順=2 ですので、※その3 の条件を満たします。
    ・*1の forコマンドです。まず "ワルツ=1"
    ・オリバケ[ワルツ]=オリバケ[1]=あああ 。 バケ名[バ番号]=バケ名[3]=いいい
     よって、Then以下が実行されます。

    ・ "オリバケ[3]" に、 "バケ名[3]" の文字列「いいい」が入ってしまいます、なんてこった。


    ・処理が終わります
    ・結果は、
      オリバケ[1]=あああ
      オリバケ[2]=いいい
      オリバケ[3]=いいい
     となり、確かに同一文字列の除外処理はされません。


    =========================

    つまり、この内容における問題は、
     「 "オリバケ[1]" と比較し、違っていたら即、新しい "オリバケ[]" に代入してしまう」
    という所にあります。

    たとえ "オリバケ[1]" と同じであっても、 "オリバケ[2]" と違う文字列であれば "オリバケ[]" に入ってしまいます。
    そして "オリバケ[1]" と "オリバケ[2]" は別の文字列ですので、
    結局どんな文字列でも "オリバケ[]" に代入されてしまい、同一文字列の除外処理には全くなりません。


    ===============================

    同一文字列を除外するためには、
    本来は、
     「オリバケ[1]と比較、違うならオリバケ[2]と比較、それとも違うのならオリバケ[3]と・・・・」
    のように、
     「その時にある、全てのオリバケ[]と違うかどうか」
    を調べなければなりません。
    そして、全てのオリバケ[]と違うことが確認されて初めて、
     「新しいオリバケ[]として文字列を代入する」
    という処理を行うようにするわけです。

    ============================

    ですから、 問題部分で行うべき内容 は、

    No.18988における
    >「算出された文字列をそれまでに現れた文字列と比較し、少しでも違うならば別な変数に保存する」
    という表現に合わせると、


    「算出された文字列を、それまでに現れた全ての文字列と、順番に比較し、
     もしも、その"算出された文字列"が、それまでに現れたどの文字列とも違うなら、
     "算出された文字列"を、別の変数に保存する」


    となるかと思います。
    問題部分を、上の「」内の内容に即したものに書き換えれば良いわけです。


    =======================

    以上です。
    バケラッタ
引用返信/返信 削除キー/
■19009 / inTopicNo.7)  Re[6]: 条件式の問題ではないようです
□投稿者/ 匿名希望 -(2006/08/15(Tue) 16:10:27) [ID:2eMbhZ9o]
    すみません。この問題は既に解決しています。
    報告が遅れてすみません。
    中箱さん、ありがとうございました。
解決済み!
引用返信/返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Pass/

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

- Child Tree -
- Antispam Version -