• 締切済み

プラスの乱数の合計とマイナス乱数の合計の商の値を上げるには?

プラスの乱数の合計とマイナス乱数の合計の商の値を上げるには? 以下ルールで乱数を使ってプラスの乱数とマイナス乱数の合計の商の値をいかにして上げられるかの検証をやってます。 しかし今の私の知恵では商の値を動かす事ができません。 乱数の範囲は-10から+10とします。 乱数を発生させ与えられた値が仮得点として加算されます。 そして任意のロジックで仮得点を正式な得点として加算します。 その任意ロジックは例えば仮得点がマイナス幾つになったら、またはプラス幾つなったら仮得点を仕切り正式な得点として加算するというもの。 但し、仮得点がマイナスの場合、プラスの場合とそれぞれ1つ以上の仕切りロジックを作らなければならない。 そして仮得点がマイナスとプラスの場合に分けそれぞれ別の変数に加算する。 (もし仮得点がマイナスなら変数mynas プラスなら変数plus) 仕切られた仮得点は0に戻る。 最終的にその計算を数多く繰り返してプラスの乱数とマイナス乱数の合計の商の値を出力する訳です。 文章では分かりにくいので、私が行いたい検証をプログラムソース風に明記します。 //仕切りロジック 例えのロジックとして仮得点が+100以上、-100以下になったら、仕切って+100、-100をそれぞれ正式得点に加算する処理を1000回繰り返し最後にプラスの変数÷マイナスの変数の商を出力 //仮得点がマイナスの場合、プラスの場合とそれぞれ1つ以上の仕切りロジックを作らなければならない(変数plusのみまたは変数mynasのみのロジックは不可) //仮得点加算変数 KariTokuTen=0 //プラス得点加算変数 plus=0    //マイナス得点加算変数 mynas=0 for(i=0;i<1000;i++){ //whileループを止める為の変数 ex=0; while(ex==0){   //乱数(-10..10)を発生させ仮得点として加算(乱数の範囲変更不可) KariTokuTen=KariTokuTen+rand(-10..10) if( KariTokuTen >= 100){ //仮得点が100以上になったら100をプラス変数に加算 plus=plus+100 //仮得点を初期化 KariTokuTen=0 //whileループを止める変数 ex=1 } else if(KariTokuTen <= -100){ //仮得点が-100以下になったら-100をマイナス変数に加算 mynas=mynas-100 //仮得点を初期化 KariTokuTen=0 //whileループを止める変数 ex=1 } } //加算処理が終了しプラス得点とマイナス得点の商の値を出力 (この商の値を上げたい) print plus/mynas 私としてはルールを守った上で上述のロジックに限らず色々なロジックを発案し(プラスの変数÷マイナスの変数)の商の値がより高くなようにしたいです。上記のロジック以外にも色々と試してみましたが商の値は+-1ばかりで全くコントロールできません。 何卒ご教授宜しくお願いします。

みんなの回答

  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.5

No.3です。 この質問の目的が「等価交換の法則を切り崩す計算方法を見つける事です。」 と本気で考えているなら、「こんな匿名掲示板で、そんな革命的なことを期待しても無理でしょう」とだけ回答します。 でも、 > 仮得点を本得点に獲得する場合の端数は切り捨てる でいいんだったら、等価交換になっていません。 それなら、 ・仮得点がプラスの場合、1以上なら、plusに1加算(2以上は端数なので切り捨て) ・仮得点がマイナスの場合、そのままminusに加算 とすれば、プラスされる値はほとんど切り捨てられ、 マイナスされる値は最大限にマイナスされるので、 plusとminusの比率に偏りがでてくると思います。 「0以上なら、plusに0加算(1以上は端数なので切り捨て)」 でもいいのだったら、plus/minusは、絶対0になりますね。 でも、 > また公開してなかったロジックのルールには、仮得点の最高点から-100点引かれたら仕切るというルール > もあります。 って、今まで100で仕切るとか-100で仕切るとか、単なるロジック例でしかなかったはずのに、 「仮得点の最高点から-100点引かれたら仕切る」って細かい仕切り方までルールになったのですか!? これじゃあ、1で仕切るとか0で仕切るってのもたぶん禁止なんでしょうかね・・ なにか実在の問題をモデル化して質問しようとしているような雰囲気を感じますが、 それをきちんとモデル化できていないように思います。 実在の問題の解決方法をそのまま質問すればいいのに、 それを隠している限りたぶん期待する回答は得られないでしょう。 発想の転換ということで、期待していないであろう回答をもう1つ思いつきました。 質問の例のように、なにか条件を満たすまで無限に乱数を発生させる ループをしていいのだったら、plus/minusがある値以上になるまで 無限に乱数発生を繰り返していけばいいでしょう。 質問の例の while(ex==0){ を while((minus != 0) && (plus/minus > 目標値)){ に替えればいいだけですね。 目標値によっては、プログラムが終了するまでに 何時間かかるか何日かかるか何十年かかるかわかりませんけど。 いわゆる「ギャンブルは勝つまで続けていれば、絶対に負けない」理論です。

cs4f18df
質問者

補足

度々ご回答ありがとうございます。 言われた通りのplus、minusのどっちか片方を端数を切り捨てず条件が整ったら仮得点全てを加算 もう一方をを端数を切り捨てをやってみましたが、plus/minusは動かせませんでした。 最初で言われたとおりplus、minusの均衛を切り崩す革命的な計算は難しいなと感じました。 どうしてあらゆるロジックを仕掛けてもplus、minusの量は互角になるんだろう..

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

この問題に対して「あなたが一切解釈/翻訳していない表現」はどこかにありませんか? 私も #3 と同じく, 「ここに書かれてルールは不明確」だと感じます. 乱数を使っているにもかかわらずその分布を書かないってのは明らかにおかしい. あるいは「本当は単純なルールなんだけど, 誰にも理解できないようにわざと複雑奇怪に書いている」のかもしれません. 言い換えると「本体は明確に表現できるんだけど, 質問者の理解度ないし日本語の問題で明確に表現できていない」とも表現できますが. 以下余談ですが, 「プラスの値とマイナスの値の発生確率が等しい」と仮定しても (注: 元の文章ではこれすら保障されていない), 比を取る関係上「期待値が -1」とはならないはずです>#2. x/y と y/x が等確率になるとすると, その和は必ず -2 以下 (x と y の絶対値が異なれば -2 未満) になります.

cs4f18df
質問者

補足

言葉足らずのもので言おうとしてる事がうまく伝えられず回答された方を戸惑わせてしまい済みません。 私の求めようとしてる事はNo.3の回答者に対しての補足の通りです。 改めてよろしくお願いします。

すると、全ての回答が全文表示されます。
  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.3

> plus、minusには仮得点をありのままの値で代入しなければなりません。 そういうルールがあるのだったら、質問に記載されているサンプルは はルール違反だと思います。 仮得点が105になった場合、plusに100加算して仮得点は0にしていますから、 本来105点加算されるべきところが100点しか加算していません。 5点捨てています。 それがOKなのに、仮得点を全て捨ててplusに100000を代入(または加算) するのはNGだというのですよね? 結局、ルールがきちんと定義されていないように見えます。 なんの目的があってこのようなことをしようとしているか わかりませんが、その目的を説明しない限り適切なアドバイスは 得られないでしょう。 なんとなく、等価交換の法則を無視して何かを錬金したり、0から 無限のエネルギーを引き出す永久機関を作成しようとしている ようなイメージを感じます。

cs4f18df
質問者

補足

ルールの明確さに掛けてしまい回答された方に対し失礼して済みません。 簡潔にこの乱数獲得アルゴリズムのルールを述べると以下の通りです。 乱数は-10~10までの範囲とし出力された値を仮得点として加算する 仮得点を本得点とする為のロジックルール作成ただし以下のルールでロジックを作成しなければ ならない  仮得点はプラスの場合とマイナスの場合とでそれぞれ別々の変数(plus、minus)に加算する    仮得点がプラスの場合、マイナスの場合とそれぞれ1つ以上のロジックを作らなければならない (仮得点+100のみ場合加算と言うロジックだけでは不可で、仮得点+100のみ場合加算と    仮得点-100のみ場合加算というペアーなどのロジックを作成し、仮得点がプラスの場合、マイナスの   場合と双方の仕切りに対処できるロジックを作成する必要がある) 仮得点を本得点に獲得する場合の端数は切り捨てる   (例:仮得点が+100になれば本得点に加算する場合、仮得点が120になった場合は本得点に   に加算する点数は100、残りの20点は切捨てる、マイナスもこの逆の要領で加算) ※この得点獲得方法に関してのルールが不明瞭で済みません。 こういうルールの上で、plus/minusの値をコントロールできる様にならないと目的が達せられないので。 まさに私の目指す事は等価交換の法則を切り崩す計算方法を見つける事です。 別の言い方をすると与えられた乱数がプラスかマイナスかの確率は1対1なのを上記ルールの範囲で計算式を作成しその互角の法則を切り崩しplusとminusの比率に差をつけられる様にするにはどの様な計算式を 作れば良いかを知りたいです。それができずに困ってます。 また公開してなかったロジックのルールには、仮得点の最高点から-100点引かれたら仕切るというルール もあります。つまり仮得点が70点まで達した場合、その点から-100点の-30点以下まで減ったら仕切るというルールです。これを最初に書くべきでした。 改めてよろしくお願いします。       

すると、全ての回答が全文表示されます。
  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.2

> 乱数を発生させ与えられた値が仮得点として加算されます。 > そして任意のロジックで仮得点を正式な得点として加算します。 > 但し、仮得点がマイナスの場合、プラスの場合とそれぞれ1つ以上の仕切りロジックを作らなければならない。 > そして仮得点がマイナスとプラスの場合に分けそれぞれ別の変数に加算する。 > (もし仮得点がマイナスなら変数mynas プラスなら変数plus) 任意のロジックがなんでもいいんだったら、 ・仮得点がプラスの場合、plus=10000000 (その変数で表現可能な最大値) ・仮得点がマイナスの場合、minus=1 とすれば、plus/minusは、常に表現可能な最大値になるでしょう。 発生したプラス乱数とマイナス乱数を最終的にそのまま加算しなければ ならないんだったら、プラス値とマイナス値が発生する確率は 同じなので、plus/minusの期待値は-1にしかならないでしょう たぶん、こんな答えを期待しているのではないと思うので、 ルールの説明が全く足りないのでしょう。 ちなみに、質問にあるロジックは ・whileまたはforを閉じる「}」が足りない。 ・KariTokuTenが-100以下になるような乱数パターンが発生しなかった場合、 plus/minusは例外発生となります。(minusが0のままのため)

cs4f18df
質問者

補足

ご回答ありがとうございます。 何だがこの質問を明確に表現するのは難しいですね。 >任意のロジックがなんでもいいんだったら、 >仮得点がプラスの場合、plus=10000000 (その変数で表現可能な最大値) >仮得点がマイナスの場合、minus=1 >とすれば、plus/minusは、常に表現可能な最大値になるでしょう。 これなら確かに簡単にplus/minusの値を上げられます。 言葉足らずでしたがplus=10000000とするロジックも不可です。 plus、minusには仮得点をありのままの値で代入しなければなりません。 なのでplus/minusを操縦する事が容易ではないんですね。 目的を達成させる為にはこういう事はできません。

すると、全ての回答が全文表示されます。
  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

開発環境が何者なのか分かりませんが 確認の手助けとして 1.rand(-10..10) で本当に期待する値が返ってきているか確認する   乱数初期化関数などコールしないとプログラム起動毎に   同じ順番で同じ数値が返ってきませんか? 2.最終的に求められた plus と mynas の各値が何になっているか確認する 3。除算の段階で mynas が 0だった場合アプリ飛ぶ気がします   (0除算対処を考えていない) 4.plus と mynas 型が不明ですが最悪オーバフローしませんか?   (100×1000 が最高なので±10万 扱える型で無いと駄目) これらの項目チェックしてみては? ±1にしかならないってことだと乱数がまともに生成できてない可能性が 一番高いような気もします

cs4f18df
質問者

補足

ご回答どうもありがとうございます。 プログラムの不具合は見受けられませんし、プログラムの不具合について質問した訳でありません。 乱数も正常に出力されます。 私としてはある目的でplus/mynasの商の値を上げる確率的なテクニックを知りたいのです。 その為にルールの範囲で様々なロジックを発案してこの問題を解決したいです。 今の私の論理力では不可能なので質問させて戴いております。 つまり今回の質問させて戴いている疑問を簡潔に表現すると コインを投げて表がでれば+1点、裏が出れば-1点のルールで、どの様なロジックを組めばいかに点数が稼げるか? です。

すると、全ての回答が全文表示されます。

関連するQ&A