• 締切済み

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

プラスの乱数の合計とマイナス乱数の合計の商の値を上げるには? 以下ルールで乱数を使ってプラスの乱数とマイナス乱数の合計の商の値をいかにして上げられるかの検証をやってます。 しかし今の私の知恵では商の値を動かす事ができません。 乱数の範囲は-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

  • エクセル   絶対値の合計

    プラスの値とマイナスの値が混ざった数値をマイナスもプラスとして合計したいのですが何か関数はありませんか?

  • 正負の乱数をいくつか合計する過程でとる最大値

    正負の乱数100個の値の合算値を求める、という作業を何度も繰り返し それぞれの合算値の平均を求めるとゼロになると思いますが、 100個合算する過程での最大値(絶対値)はどの程度になるのか というのを求めるにはどのようにすれば知りたいです。 例えば、-3、-2、-1、0、+1、+2、+3という7つの目を持つサイコロを使って すごろくをするとします。 すごろくも特殊な物で、スタートからプラス50マス進んだところにゴール(天国)があり スタートからマイナス50マス進んだところにもゴール(地獄)があるものとします。 ゴールにはピッタリ止まる必要はなく到達すればゴールとします。 1)サイコロを100回振った場合にゴール(天国または地獄)に到達できる確率を 求めるにはどうすればよいでしょうか? 2)ゴールを無くしてプラス方向マイナス方向ともに無限大のすごろくとしたとき、 サイコロを100回降った場合に平均でどのくらいまで(一瞬でも)進むことができる のでしょうか。 計算がややこしければ0のない-3、-2、-1、+1、+2、+3の6つの目のサイコロでも 構いませんし、-1、+1の2つの目のサイコロでも構いません。 以上、よろしくお願いします。

  • Excelの関数でマイナス値の場合は加算しないように設定する式は?

    Excelの関数でマイナス値の場合は加算しないように設定する式は? Excel(2007)で、 セルB1=A1+B2 という計算で、下の行も同じように設定します。 つまり、   C1=B1+C2   D1=C1+D2    …… 今回の累積値=前回の累積値+今回の値 という式ですが、今回の値がマイナスの場合は、加算(マイナスなので結果として差し引く)ことをしないため、マイナス値の場合は今回の値を加算しない、または0とみなすようにしたいのですが、どのように設定すればよいでしょうか。 プログラムでは条件分岐で2つ目の変数が0未満の場合は0というような処理ができそうですが、Excelでマクロなど使わずに簡単に設定できる方法はないでしょうか。

  • マイナスを使ってはいけない理由を教えてください。

    マクローリン級数展開をコンピュータで計算する際に、マイナスの値を使うとできない計算があります。具体的な式は、e=1+x+xの2乗/2の階乗+xの3乗/3の階乗+xの4乗/4の階乗....xのn乗/nの階乗。 この計算をプログラムでやると正しいeの値がでません。私の作ったプログラムを以下に載せます。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define NUMBER 1.e-15 main() { double c,x,y,total,myexp(); x=-10; y = myexp(x); total=exp(x); printf(\"input=%f\\n\",x); printf(\"myexp=%.10e\\n\",y); printf(\" exp =%.10e\\n\",total); printf(\" \\n\"); } double myexp(double x) { int count=1; double total,i,ex,hiritu; total = 1.0; ex= 1.0; hiritu=1.0; // if(x < 0 ){ // x=x*-1; // i=1; // } while(fabs(hiritu) >= NUMBER){ hiritu = total/ex; printf(\"count= %d \",count); total *= x/count++; printf(\" total=%.10e \",total); ex += total; printf(\" ex =%.10e \",ex); printf(\"\\n\"); } // if(i == 1){ // ex = 1/ex; // } return(ex); } //の行をコメントではなくすると、マイナスの値を入れたときでも、正確な値を出すプログラムになります。デバックの行なども入っていますが、コンピュータで、このプログラムを用いて、マクローリン級数展開をすると、マイナスの値で正確な値がでない理由を知りたいです。ヒントでもいいのでお願いします。

  • C++ プラス記号とマイナス記号を交互に表示したいです。

    C++ プラス記号とマイナス記号を交互に表示したいです。 現在、C++の勉強を柴田望洋さんの本『新版 明解C++ 入門編』で勉強しています。 使用ソフトはvisual C++ 2010express です。 【質問です】 自分が入力した値の数だけ、プラス記号とマイナス記号を交互に表示させるコードを書いているのですが、何度挑戦しても、思うような結果が得られません。 どなたかわかる方がいましたらアドバイスを頂きたいです。 どうぞよろしくお願いします。 ●正しい結果の例 入力した値が1の時。 + 入力した値が2の時。 + - 入力した値が3の時。 + - + 入力した値が4の時。 + - + - ●私のコードによる結果 入力した値が1の時。 + - 入力した値が2の時。 + - 入力した値が3の時。 + - + - 入力した値が4の時。 + - + - ●私が書いたコードです。 # include <iostream> using namespace std; int main() { int n; cout<<"何個表示させますか?\n"; cin>>n; if (n>0) { while (n>0) { cout<<'+'; n - -;    //  ←見にくいと思いますがデクリメントです。 cout<<'-';     n - -;    // ←見にくいと思いますがデクリメントです。 } } }

  • 文字列の演算

    文字列の値を1バイトずつ加算して、加算した値の最後の1バイトだけ、取得するというロジックを教えてください。 たとえば、 0x49 0xfc 0x31 0x9e 0x9e と変数aにはいっていた場合、 これを1バイトずつ加算する方法は・・・?

  • Excel, 数式の結果に符合をつけるには

    得点 失点 合計 15% 5% 20% 26% 4% 30% ----------------- 41% 9% 50% ここで41%と9%にそれぞれプラスとマイナスの符号をつけたいんですが、 そんな方法はありますか??

  •  変数「$data」>=10 の場合”10以上”、

    <?php $a = 10; $var = ($a>0 ? "プラスです" : "マイナスまたは0です"); print ($var); ?> 以上のパーツを使用して、   変数「$a」>=10 の場合”10以上”、それ以外なら”10以下”と表示する。  を作成することはロジック上可能でしょうか!?    よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 条件付のsum,max,min関数の書き方

    sum関数なので、合計欄のセルに ex.=SUM(B1:B6)などと書くときに、 a列が"1"の場合のみ合計欄のセルに加算したい場合は どうやって書けばいいでしょうか? __ A B 1 1 100 2 0 200 3 1 300 4 0 400 5 1 500 6 0 600 合計欄の値=900にしたいのですが.... もしも書き方があるのであれば、 MAX,MINの場合も同じでしょうか?

  • Excel セル内の式

    Win2000 Excel2000 いつもお世話になっております A列に「○」と「×」の2種類の値が設定されます B列には手入力した、数値が入ります(ここに式は設定しません) 上記内容でデータがN件設定されます ルールとしましては A列が○の時B列の値はプラス A列が×の時B列の値はマイナスとなります 但し、B列にプラスやマイナスの記号は表示しません B列の合計をC1に式を組むことにより、求めたいのですが可能でしょうか? Ex) A列  B列    C1 = 25 ←(式により25を求めたいです) ○    10 ○    20 ×    5  ・    ・  ・    ・