• ベストアンサー

乱数について(C言語)

C言語において,乱数の範囲を 0 ≦ r < 1 とする場合には double r=(double)rand()/(RAND_MAX+1); とするのは知っているのですが0 < r ≦ 1にする場合の方法がわからず困っています. アドバイスいただきたいです.

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

  • ベストアンサー
noname#158634
noname#158634
回答No.1

C言語じゃなくて数学の話だな。 「0 ≦ r < 1」を「0 < r ≦ 1」にするには r = 1 - r

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

関連するQ&A

  • 乱数をC言語で

    乱数をC言語でプログラムしたいのですが、 rand関数を使わずに作らなきゃいけないという事なんですが 一度作ってはみたもののうまく乱数にできずに困っています できれば教えていただきたいです

  • 乱数の最大値

    C言語で0~Nまでの乱数を発生させる場合、 srand((unsigned) time(NULL)); rand()%N; とやりますよね。 このやり方だと、発生する乱数はRAND_MAX以下しかできません。 RAND_MAX以上の値を発生させるにはどうすればいいのでしょうか?

  • 乱数について

    C言語で0~1の乱数を作成する部分を書いているのですが num[i] = rand()/(RAND_MAX+0.1); と書いてループさせています。 numはdouble型で定義しているのですがこれで実行すると桁数が下6桁まで表示されてしまいます。 欲しいデータは0.1、0.2・・・1.0までの0.1刻みのデータなのですが桁数を制限するにはどうすればいいのでしょうか?

  • 標準正規分布の乱数

    RAND()関数は ((double)rand() / (1.0 + RAND_MAX))と定義します。 中心極限定理により、一様乱数を足し合わせると正規分布に近づくことから、 x = 分散 * (Σ[1~12]RAND() - 6) + 平均 で正規乱数が作れる。標準正規分布は分散1、平均0なのでその乱数は x = Σ[1~12]RAND() - 6 ですよね。この乱数を例えば100個羅列するにはどうしたらいいのでしょうか? もし間違ってたら指摘してください。 参考文献「Cによるシミュレーションプログラム 石川宏」 #include <stdio.h> #include <stdlib.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) #define NUMBER 10000 /* 発生させる乱数の数 */ main(void) { int j; double u, x; srand(5); for (j = 0; j <= 11; j++) { u = u + RAND(); } x = u - 6.0; }

  • c言語乱数について

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

  • 乱数について

    乱数の分布を見るために以下のようなプログラムを書きました。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,imax, S[RAND_MAX], r; double x,y; FILE *output1; output1=fopen("random2.data","w"); imax=100000; for(i=0;i<=imax;i++){ r = rand(); S[r] += 1; } for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } return 0; } するとコンパイルできて実行もできるのですが、なぜか乱数が30000を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。

  • 高精度乱数関数

    rand()の値をRAND_MAX+1で割ると、[0, 1)の範囲になりますよね。 もし、RAND_MAX+1が2の乗数なら、浮動小数において結果は丸め誤差を含んでいないはずですよね。 unixのgccでコンパイルしたのですが、RAND_MAXの値は32767だったので、 #define (RM RAND_MAX + 1) #define RND ((long double)rand()) long double x; x = RND / RM + RND / RM / RM + RND / RM / RM / RM + RND / RM / RM / RM / RM ・ ・ ・; とすれば、精度の高い[0, 1)区間の乱数関数を作ることはできますか? この論理に間違いがあれば指摘してください。

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

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

  • 正規分布の乱数生成

    C言語で正規分布の乱数を発生させたいのですがどうすればいいのでしょうか? 自分なりにネットで検索して調べたのですが void gaussrand() { static double V1, V2, S; static int phase = 0; double X; if(phase == 0) { do { double U1 = (double)rand() / RAND_MAX; double U2 = (double)rand() / RAND_MAX; V1 = 2 * U1 - 1; V2 = 2 * U2 - 1; S = V1 * V1 + V2 * V2; } while(S >= 1 || S == 0); X = V1 * sqrt(-2 * log(S) / S); } else X = V2 * sqrt(-2 * log(S) / S); phase = 1 - phase; } こうありました。 例えば平均50の分散9の正規分布の乱数を1000個発生させて、配列seiki[1000]に代入したいときは、このプログラミングをどのようにすればいいのでしょうか? もちろん、このソースではなく、他のもので説明していただけても全然構いません。 また、もしよろしければ、正規分布の他に、二項分布など他の分布でのデータの生成方法もお教えいただけたら幸いです。 よろしくお願いいたします。

  • C言語を実行すると-infが出てきて困っています。

    C言語を実行すると-infが出てきて困っています。 コンパイラはgccを使っています。 よろしくお願いします。 #include <stdio.h> #include <math.h> #include <stdlib.h> #define data 100//計算回数 double seiki(void)//正規乱数 { double n; double i; double y; double x1,x2; double sigma; double mean; double Pi = 2*asin(1); sigma = 1; mean = 0; { x1 = (double)rand()/(RAND_MAX); x2 = (double)rand()/(RAND_MAX); y = sigma*sqrt(-2*log(x1))*sin(2*Pi*x2) + mean; //printf("%f\n",y); } return (y); } int main(void) { double* price; int i, j, k; double a, b, c; //メモリ確保 price=(double*)malloc(sizeof(double)*data+10); for(i = 0;i<data;i++) { price[i+1] = price[i]+seiki(); printf("%lf\n",price[i+1]); } return 0; }

3.2アイコン作りたい
このQ&Aのポイント
  • ネットで3.2を購入したがアイコンが作れない
  • ソースネクスト株式会社の製品・サービスについての質問です
  • アイコン作成に関する問題が発生しています
回答を見る

専門家に質問してみよう