掲示板ランキング  プラスター(プラスター)  プラスター(フェルビナク配合)  塗り薬(ゲル)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7362

乱数の発生方法
投稿者---999(2007/04/18 09:06:44)


-10から10までの小数の乱数を発生させたいのですが方法がわかりません。
教えてください。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:乱数の発生方法 7363 YuO 2007/04/18 09:47:48


No.7363

Re:乱数の発生方法
投稿者---YuO(2007/04/18 09:47:48)


>-10から10までの小数の乱数を発生させたいのですが方法がわかりません。

rand()の戻り値は[0, RAND_MAX]の範囲の値ですから,((double)RAND_MAX)で割る事によって,[0, 1]の範囲の乱数を得る事が出来ます。
あとは20倍して10を引けば,目的の[-10, 10]の範囲の乱数を得る事が出来ます。



この投稿にコメントする

削除パスワード

No.7364

Re:乱数の発生方法
投稿者---999(2007/04/18 10:50:01)


>>-10から10までの小数の乱数を発生させたいのですが方法がわかりません。
>
>rand()の戻り値は[0, RAND_MAX]の範囲の値ですから,((double)RAND_MAX)で割る事によって,[0, 1]の範囲の乱数を得る事が出来ます。
>あとは20倍して10を引けば,目的の[-10, 10]の範囲の乱数を得る事が出来ます。

できました。ありがとうございました。




この投稿にコメントする

削除パスワード

No.7365

Re:乱数の発生方法
投稿者---yoh2(2007/04/18 22:38:32)


>rand()の戻り値は[0, RAND_MAX]の範囲の値ですから,((double)RAND_MAX)で割る事によって,[0, 1]の範囲の乱数を得る事が出来ます。

ついでに、 rand() を (RAND_MAX + 1.0) で割れば[0, 1)、 (rand() + 1) を
(RAND_MAX + 1.0) で割れば(0, 1]、 (rand() + 1) を (RAND_MAX + 2.0) で
割れば(0, 1)の範囲の乱数を得ることができますね。
ただし、double型が (RAND_MAX + 1.0 (or 2.0)) を正確に表現することができるだけの
精度を持っている必要がありますが。

それぞれ[-10, 10)、(-10, 10]、(-10, 10)の範囲の乱数を得たい場合にどうぞ。


この投稿にコメントする

削除パスワード

No.7367

Re:乱数の発生方法
投稿者---chu-(2007/04/19 13:22:45)


> rand()の戻り値は[0, RAND_MAX]の範囲の値ですから,((double)RAND_MAX)で割る事によって,[0, 1]の範囲の乱数を得る事が出来ます。
> あとは20倍して10を引けば,目的の[-10, 10]の範囲の乱数を得る事が出来ます。

その方法(下記A)では +10 の発生確率に問題があります。
C FAQに載っている方法(下記C-FAQ1,2,3)と合わせて特性を比較してみました。

C FAQ 13.16:
http://www.kouno.jp/home/c_faq/c13.html#16

[test.c]
#include <stdio.h>

#define RAND_MAX 32767

int main(void)
{
    long areaA[21] = {0};
    long area1[21] = {0};
    long area2[21] = {0};
    long area3[21] = {0};
    long *countA = areaA + 10;
    long *count1 = area1 + 10;
    long *count2 = area2 + 10;
    long *count3 = area3 + 10;
    int rand;
    int n;

    for (rand = 0; (unsigned)rand <= RAND_MAX; rand++) {
        n = (int)(rand / (double)RAND_MAX * 20) - 10;   /* A */
        countA[n]++;
        n = rand % 21 - 10;                             /* C-FAQ1 */
        count1[n]++;
        n = (int)(rand / (RAND_MAX + 1.0) * 21) - 10;   /* C-FAQ2 */
        count2[n]++;
        n = rand / (RAND_MAX / 21 + 1) - 10;            /* C-FAQ3 */
        count3[n]++;
    }

    printf("\tA\tC-FAQ1\tC-FAQ2\tC-FAQ3\n");
    for (n = -10; n <= +10; n++) {
        printf("%+d\t%ld\t%ld\t%ld\t%ld\n", n, countA[n], count1[n], count2[n], count3[n]);
    }

    return 0;
}

[実行結果]
>lcc test

>test
        A       C-FAQ1  C-FAQ2  C-FAQ3
-10     1639    1561    1561    1561
-9      1638    1561    1560    1561
-8      1639    1561    1561    1561
-7      1638    1561    1560    1561
-6      1638    1561    1560    1561
-5      1639    1561    1561    1561
-4      1638    1561    1560    1561
-3      1638    1561    1561    1561
-2      1639    1560    1560    1561
-1      1638    1560    1560    1561
+0      1638    1560    1561    1561
+1      1639    1560    1560    1561
+2      1638    1560    1560    1561
+3      1638    1560    1561    1561
+4      1639    1560    1560    1561
+5      1638    1560    1561    1561
+6      1638    1560    1560    1561
+7      1639    1560    1560    1561
+8      1638    1560    1561    1561
+9      1638    1560    1560    1561
+10     1       1560    1560    1548

>



この投稿にコメントする

削除パスワード

No.7368

Re:乱数の発生方法
投稿者---chu-(2007/04/19 15:16:50)


> -10から10までの小数の乱数を発生させたいのですが方法がわかりません。

"少数"でしたね。
失礼しました。



この投稿にコメントする

削除パスワード

No.7369

Re:乱数の発生方法
投稿者---YuO(2007/04/19 15:32:31)


> その方法(下記A)では +10 の発生確率に問題があります。

無意味な話です。
あくまで実数の範囲で話をしているのであって,整数の範囲で話をしているのではないですから。

chu-さんの書いている話は,実数の範囲[-10, 10]の値について,整数にキャストするという多対一の演算を行った場合の分布を見ているだけですから,当然の結果です。
意味のある話をしたいのであれば,発生する可能性のある各々の値についての分布の偏りが,元の乱数発生関数における分布の偏りよりも有意に大きいことを示して下さい。


そういや,標準規格では小数部を捨てるはずなので,0の発生確率が他よりも多く,±10の発生確率が他よりも小さいはずなのですが……。
# ISO/IEC 9899:1999 6.3.1.4 Real floating and integer


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ