パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

タレコミ記「カルドセプトサーガ店頭回収へ」」記事へのコメント

    • 下リンク
      > やがてそのような書き込みの中に、Cコードを示して「サイコロなんかたったこれだけで作れるのに」と発言する物が複数現れた。そしてこれが最も重要な点だが、そのようにして示されたコードは、私が見た限りでは一つ残らず全てカルドセプトサーガのプログラマが犯したのと同じミスをしていた。

      自力で疑似乱数作ったとでも思ってたんだろうか・・・
      そっちのほうが、その関数の性質よく分かってるだろうから、ミスしないと思うんだが・・・

      # それより、2chって意外かなぁ?
      親コメント
      • ようは、rand() % 6 + 1 (だっけ?)みたいなコードを書いてしまった人達が多かったんでしょ。本来ならば、rand() / (RAND_MAX / 6 + 1) + 1 とか書かないと、カルドセプト乱数と同じように、奇数・偶数の法則性が出ちゃうよって事でしょ。
        • by Anonymous Coward on 2006年12月18日 0時29分 (#1077397)
          いまどきのVC++やglibcのrand()は、下位bitのランダム性に問題はないんですがねえ。XBoxだったらMSのlibcでしょう?% 6 しても問題なさそう。
          このゲームの作者は線形合同法のコードを自分で書いた上で % 6 したのでは?

          参考: Linuxのrand(3)のman

          The versions of rand() and srand() in the Linux C Library use the same random number generator as random() and srandom(), so the lower-order bits should be as random as the higher-order bits. However, on older rand() implementations, and on current implementations on different systems, the lower-order bits are much less random than the higher-order bits. Do not use this function in applications intended to be portable when good randomness is needed.
          推測ですがね。
          親コメント
        • 2ちゃんねらは元コードがどんなだと思ってたんだ?という話かと。
        • コードの書き方の問題じゃないと思うんだけどね。
          「自分が使ってる乱数生成ルーチンがどういう性質の乱数を発生させるのか」というのを意識できるかどうかがポイントだと思うよ。
          意識した上で (乱数 % 6) + 1 で問題なければ、それでいいと思うし。
          #意識できれば、実際に規則性が無いかどうかの動作検証くらいやるだろうしね。

          下のレイヤーを意識できてないと、いろんな問題を発生させると思う。
          • >自分が使ってる乱数生成ルーチン

            たぶん、用意されている関数そのまま使っていて、意識してないんじゃないかな。
            バグではあるけど、(乱数 % 6) + 1 も本来はコードとして間違いじゃない。
            乱数については、言語(に用意されてる関数)のバグだよね。
            (自分で乱数関数かいててのバグなら言い訳きかないが)

            用意されてる乱数関数の下位ビットの信頼性が低い事がそもそもの問題なわけで。

            言語マニュアルで"この言語の乱数の下位ビットは信用できません”なんて書いてる訳でもないし。

            #もちろん、テストして見つけられなかったPG、テスタの責任がなくなるわけではない。

            ほかのフリーズとかのバグは。。。。どうしようもないね。
            • 言語マニュアルで"この言語の乱数の下位ビットは信用できません”なんて書いてる訳でもないし。

              信用できない事が分かっていれば書いていると思いますが。 例えばDarwinのマニュアルでは信用できない乱数 [hmug.org]には使うなと書いています。 「下位ビットは信用できません」はこっちを使え [hmug.org]とした方に書いてますけどね。

            • 単に乱数生成機としか記述されてないのなら、そこに「質のいい乱数を生成するはずだ」という前提を置くべきではないでしょ。
              「下位ビットまで一様にランダムである」という明記されてるのに、実際はそうでなかったとかいうのなら乱数生成機のバグだと思うけど。
            • > 言語マニュアルで"この言語の乱数の下位ビットは信用できません”なんて書いてる訳でもないし。
              普通はマニュアルに書いてるだろ。よくいるんだよね、マニュアル読まずに書いてないって言うやつ。
              • "擬似乱数を生成します”と書いてあっても性質まで書いてあるマニュアルは私は見たことないのですが。。。
                まぁ、経験が少ないことは否定しませんが。

                手持ちのJAVA
                http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html
                http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html

                EXCEL
                0 以上で 1 より小さい乱数を発生させます。ワークシートが再計算されるたびに、新しい乱数が返されます。
                書式
                RAND()
                解説
                a と b の範囲で乱数を発生させるには、次の数式を使います。
                RAND()*(b-a)+a

                .net
                http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfsystemrandomclasstopic.asp

              • UNIX系の manでは書かれてることが多い気がします。

                あと、Javaのマニュアルには
                > クラスでは 48 ビットのシードを使い、このシードは線形合同法で変更されます。
                > 詳細は Donald Knuth 著『The Art of Computer Programming, Volume 2』の 3.2.1 を参照してください。
                という記述がありますね。

身近な人の偉大さは半減する -- あるアレゲ人

処理中...