• ベストアンサー

乱数の発生確率(c++)

0,1の2値の乱数を発生させるとき、1の発生確率を例えば20%にするにはどのようにすればよいのでしょうか。 発生乱数を除算して余りを求めて・・・・の方法など試したのですが、うまいこといきませんでした。(プログラムが動かないのではなく結果が) 私の確率の認識が間違っているのかもしれませんが、この場合、1000個発生させた場合、300近く1が出れば良いということですよね。

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8016/17133)
回答No.1

普通の乱数発生器はなら0から1までの一様乱数を発生できるよね。 で、0から0.8までなら0を出力して、0.8から1までなら1を出力すれば、OK

その他の回答 (2)

回答No.3

// Visual C++ 10 でコンパイル/動作確認済 #include <iostream> #include <random> using namespace std; int main() { const int N = 10000; mt19937 rng; // メルセンヌ・ツイスタ bernoulli_distribution coin(0.2); // 確率0.2のベルヌイ分布 int true_count = 0; int false_count = 0; for ( int i = 0; i < N; ++i ) { if ( coin(rng) ) ++true_count; else ++false_count; } cout << true_count << ' ' << false_count << endl; }

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

1000個のうち300個近く、というのは、200個の書き間違いでしょうか。

関連するQ&A

  • 乱数について質問です

    乱数について質問です 抽選の結果の計算なんですが 468 114 805 の3つの自然乱数が、ありそれを合計し3で除算した余り1に1を加算して114に当選となったのですが、 計算の仕方がいまいちわからず困っています。 3つの数字を合計して、1387で3で除算し、462.333・・・という数字になりますが 余り1に1を加算してというところが解りません。 言葉足らずかもしれませんがよろしくお願いします。

  • 乱数の発生方法

    こんにちは! いつも大変参考にさせていただいております。 どうか教えていただきたい事があります。 数学は大の苦手で、学生時代からほとんど勉強してこなかっただけに、 数学の本を読んでも、今回の問題とどのように関係しているのかがわからず、お手上げ状態です。 実行したいのは、確率により乱数を発生させたいです。 たとえば、0から2の乱数を発生させるにあたり、 0の発生は50%、 1の発生は25%、 2の発生は25%、 というように、発生する確率を設定したいと思っています。 確率の本を読んでみたのですが、入門書には確率の求め方は載っていたのですが、それをどのように利用したらいいのかわかりません。 このような乱数の発生のさせかたは可能でしょうか? また、どのようにしたらいいのでしょうか? 教えてください。。。

  • 乱数とは?

    乱数について、いくつか疑問に思っていることがあります。 乱数の定義は? 辞書には、 0から9までの一〇種類の数字が、それぞれ同じ確率で現れるように並べられた数字の列。 と、書いてあります。 と言うことは、各数字の現れる確率は10%です。 大量にDATAを取れば限りなく10%に近づくと言うことです。 そこで、 DATAが少ないと乱数にも偏った値が出て各数字10%にはなりません。 と言うことは、 各数字の発生確率が偏っている段階では、 次に現れる数字の予測がある程度可能だと思っていいのでしょうか? 確率の低い数字が出る確率が高い? そうなると、 予測が可能だと乱数とは言えないのではないでしょうか? 結果として確率が均等になればいいのであって、予測が出来る出来ないは関係ない?

  • c言語乱数について

    トランプのシャッフルと同様な操作をコンピュータで行いたい。52枚のトランプを配列に置き換え、1~52の乱数を割り当てる。ただし発生した乱数はすでに割り当て済みの数である場合は、まだ割り当てていない乱数が出るまで繰り返すものとする。 というプログラムをC言語でつくりたいのですがまったくわからないので誰か教えてください。お願いします。

  • 規則に従った乱数

    一様乱数を発生させるプログラムはネット上でも入手できます。ある種の確率密度分布に従った乱数を発生させるにはどうしたらいいでしょうか。 例えば0から1の乱数ですが、平均が0.5で分散が0.2のガウス分布に従った乱数を発生させるとしたら0.5に近いところの値が多く出て、0.9のあたりはあまり出ないということになります。そういう乱数です。 そういうものを乱数というのかどうかわかりませんが。 しかし、物理現象は何らかの分布に従う乱数のようなものと考えることができるのではないでしょうか。 よろしくお願いします。

  • 正規分布に従う乱数を発生させるには?

    0以上1未満の実数のうちから均一な確率で乱数を発生できるものがあるとします。 (頭にあるのはプログラムのrnd関数です)。 この乱数をxとしたとき、このxを適当な変換式f=f(x)に代入して 正規分布に従うような数yを得たいと思います。 どうすればよいでしょうか?

  • 一様乱数の期待値

    一様乱数の理論上の期待値の求め方を教えて下さい。確率密度関数が一定という条件を用いるようです。 -1~1の一様乱数R(n)を発生させるプログラムを作って、その結果得られた乱数の期待値((R(n)*R(n))/Nと理論上の期待値とを比較するためです。具体的には、sin波に一様乱数を加えて、SN比を求める問題です。 よろしくお願いします。

  • 乱数発生ルーチンの使い方について

    数値計算において一様乱数を発生させるルーチンがいろいろあります。ソースが公開されているものやコンパイラが提供したりするものです。それらを利用する場合、乱数発生のシーズ(種)を与えてそれに応じて動作するというものが多いだろうと思います。そこで質問ですが、10000個の乱数を1回発生させる場合と100個の乱数を100回発生させる場合とで乱数の感じがかなり違います。いずれの場合も100×100の2次元データ(エクセルのシート状)として出力して作図したらその違いが簡単に分かります。この違いの原因はシーズの与え方が1回と100回という違いだろうと思います。100回のシーズの与え方にパターンが出来てしまうからだと思われます。例えば時間を使ってシーズを与えなおすことも考えられますが、今時のPCだとあっという間なのでシーズが同じだから、同じ乱数が100個できてしまいます。乱数を繰り返し発生させるときにその繰り返しの中でパターン化された乱数にならないように発生させる方法がないでしょうか。シーズが要らない乱数生成ルーチンとかですが。あるいはシーズをランダムに取得する方法が含まれたルーチン(シーズがないように見える)などです。あるいは本当にないものなど。メルセンヌツイスターはどうなのでしょうか。一応、フォートランでの利用を考えていますが、言語依存の問題ではないかもと思いますが。 よろしくお願いします。

  • エクセルで0超1未満の乱数を発生する方法

    タイトルの通りです。 EXCELのRAND関数は0以上1未満の乱数を発生しますが、0超1未満の乱数を作る方法を教えて下さい。 確率の検証用に乱数を作りたいのですが、0や1(0%や100%)は除きたいのです。もちろん非常に小さい数でも0でなければ採用したいのですが0だけはダメです。 実用上、RANDでも0は殆ど出ないとは思いますが…あるいは乱数を発生させておいて0になった時だけ再計算させれば良いのかもしれませんが、出来れば再計算無しで最初からそうしたいのです。

  • 乱数を発生させるプログラムを教えてください。

    タイトルのままなのですが、1から100までの乱数を発生させるプログラムを知りたいです。 乱数をxとおくと、xの値は、0<x<1の範囲内でお願いします。 C言語で、rand関数を用いて、どうかお願いします。

専門家に質問してみよう