以前も質問させていただいたものです。
漸化式のプログラムでXn=(153xn-1+7391)mod2 20...(2の20乗です。)
で、定義される数列{xn}は乱数とみなせるとします。この乱数を利用したプログラムを
つくりたいのですが・・・・サイコロの目が1048576面体のサイコロを
振って出た目を記録していくような簡単なゲームを作るにはどのように
作ったらいいか分かりません。サイコロの目をふって何かさせるプログラムなら、どんなもので
も、決まりはないのでおしえてください。
よろしくおねがいします。
前提となっている
>数列{xn}は乱数とみなせるとします。
自体に大きな疑問を感じます。サイコロを作りたいなら単純にrand()を使ったほうがいい
と思います。
で、
>サイコロを振って出た目を記録していくような
各プレイヤーが、自分の振ったサイコロの目を覚えられればいいのでしょうから、プレイ
ヤーの暮らすCPlayerを作り、メンバ変数にintのvectorをひとつ持たせて、サイコロを振
るたびにvectorにアペンドしていく、でいいでしょう。
あとはどういうゲームにしたいか、次第です。
unsigned int x = /* 初期値 */
while ( /* 続ける条件 */ ) {
x = (x * 153 + 7391) & 1048576;
/* x を記録する */
}
... こんだけ?
>x = (x * 153 + 7391) & 1048576;
1048575 (=0xfffff)の間違いですよね?
1048576 (= 0x100000)で&を取っちゃったら、0か1048576かの2択になってしまいます...。
...そか。そだ。失礼。
とにかく、漸化式てのは今の値から次の値を生成する規則だから、
キモはそーゆーことです。
επιστημη さんをはじめとして、いつも解答してくれて、ありがとうございます!!
あの、プログラムを10~20行くらいに膨らませたいのですが、
漸化式をどう使って膨らませたら言いのでしょうか?
たびたびすみません。
「膨らます」とはどういう意味でしょうか? επιστημηさんの例を基に、省略されていると
ころを補完するだけで十分かと思いますが。
whileループを展開すれば何十行にでも「行数を稼ぐ」事はできますがお奨めしません。
関数はコンパクトにまとめるよう努力すべきです。そもそも何故「膨らませたい」ので
しょうか。
ちょっとでも'縮めたい'てのはよくあることだが、
'膨らませたい'とは面妖な。
みほさんはこいつをどう膨らませたいのでしょう?
それがわからんことには...10行程度のコメント入れる
くらいしかやることないですねぇ^^;
επιστημηさんがおしえてくださった
unsigned int x = /* 初期値 */
while ( /* 続ける条件 */ ) {
x = (x * 153 + 7391) & 1048575;
/* x を記録する */
}
をやってみたのですが2行目でexpression syntaxになってしまい
実行することができませんでした・・それと、10行くらい増やしたいというのは
学校の宿題でそのように要求されてしまって・・どうしたらよいのかわからないもので、
すみません。この漸化式をつかってサイコロのゲームというのは
たとえばどのようにつくったら良いのでしょうか?
どんなものでもいいので、ヒントをいただけないでしょうか?
たびたび、お手数大変もうしわけないです。
えー、「/*」から「*/」まではコメントとして扱われる、ということはご存じですよね?
つまり、επιστημηさんが示してくださった例は、コンパイル時には
unsigned int x =
while ( ) {
x = (x * 153 + 7391) & 1048576;
}
として扱われます。1行目はセミコロンがないので文が完結しておらず、2行目のwhileを
指して「なんじゃこりゃ」とコンパイラはエラーを出しています。
επιστημηさんが「/* 初期値 */」としか書けなかったのは、あなたが初期値を明記しな
かったからです。あなたしか知らない内容なので、コメント部分は適宜置き換えてくださ
い、ということです。
>この漸化式をつかってサイコロのゲームというのは
>たとえばどのようにつくったら良いのでしょうか?
何のルールの提示もなく「どのように作ったら...」と訊いてきているのですから、私が
既に申し上げたように、
>あとはどういうゲームにしたいか、次第です。
まず、宿題の内容を把握してください。
>10行くらい増やしたいというのは
>学校の宿題でそのように要求されてしまって
これは、「漸化式を使ったサイコロ」だけで10行増やせといっているのですか? それと
もゲームの部分を含めて、ですか?
前者なら「十分短くまとまっているものを何故膨らます必要があるのか」という部分が理
解できないことには始まりません。私やεπιστημηさんは「そんな必要はない」と考えてい
ますし、あなたがまだここに書いていない、何か他の重要なことがあるのかもしれません。
後者なら、ゲームのルールを決めてその内容を記述すればいいだけの話です。10行くらい
簡単に稼げるでしょう。
「なんて冷たい回答だ」と思われるかもしれませんが、情報不足故答えようがないという
のが本音です。もっと言ってしまえば「宿題の丸投げにしか見えない質問は嫌われます。
仕様上の中尉をよく読んでください。」
>...
> をやってみたのですが2行目でexpression syntaxになってしまい
> 実行することができませんでした・・
...tibさんの仰るとおり、/*...*/の部分は 'あなたが埋めてください'
# ひょっとして int main() { ... } で囲むことすらしなかったとか...まさかね
> それと、10行くらい増やしたいというのは学校の宿題でそのように
> 要求されてしまって・・どうしたらよいのかわからないもので、
できたコードを10数行膨らませなさいなんて要求ですか? 信じられない。
> すみません。この漸化式をつかってサイコロのゲームというのは
> たとえばどのようにつくったら良いのでしょうか?
tibさんの仰るとおり、僕らはさいころゲームのルールを知りませんから、
できるのは漸化式による乱数の生成ををコードで表現することだけです。
さいころゲームのルールを作り、実装するのは僕らではありません。あなたです。
> どんなものでもいいので、ヒントをいただけないでしょうか?
ヒントの与えようがないのですよ。
あなたが何をしたいのかが'具体的に'わからないかぎり。
なんか、やり取りを読んでいると、みほさん自身が宿題の内容を把握していないような
気がします。プログラムは論理的な思考が必要です。問題の内容を把握していなければ、
解答にはたどり着けないと思います。
あと、サイコロを振った結果を得るための式が設定されているというだけで
サイコロを振ってその結果を記録すると言う部分については普通の思考でいけると思います。
厳しい言い方をすれば、その部分くらいは自力で考えられないとこの先厳しいと思います。
サイコロの部分を単にrandで発生させた単純な物を考えて、その部分をそっくり与えられた
式に置き換えれば済むのではないですか?
アプローチのやり方を変えるだけで意外と問題が簡単になる場合もあります。
いろいろ試してみましょう。
