Namespaces
Variants

rand

From cppreference.net
ヘッダーで定義 <stdlib.h>
int rand ( ) ;

0 から RAND_MAX までの範囲( 0 および RAND_MAX を含む)の疑似乱数整数値を返します。

srand() rand() で使用される擬似乱数生成器にシード値を設定します。 rand() srand() の呼び出しより前に使用された場合、 rand() srand ( 1 ) でシードされたかのように動作します。 rand() srand() で同じシード値で初期化されるたびに、同じ値のシーケンスを生成しなければなりません。

rand() はスレッドセーフであることが保証されていません。

目次

パラメータ

(なし)

戻り値

0 から RAND_MAX までの範囲(両端を含む)の疑似乱数整数値。

注記

生成される乱数列の品質について保証はありません。 過去には、一部の rand() 実装において、生成される数列の乱数性、分布、周期に重大な欠陥がありました(有名な例では、下位ビットが呼び出しごとに単に 1 0 を交互に繰り返すものでした)。 rand() は、暗号などの本格的な乱数生成が必要な用途には推奨されません。

POSIXでは、 rand が使用する疑似乱数生成器の周期が少なくとも 2 32
であることを要求しています。

POSIXはスレッドセーフ版のrandとして rand_r を提供していましたが、これは drand48 ファミリーの関数を優先するため廃止されました。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
    srand(time(NULL)); // 乱数生成器のシードとして現在時刻を使用
    int random_variable = rand();
    printf("Random value on [0,%d]: %d\n", RAND_MAX, random_variable);
    // 6面ダイスを20回振る
    for (int n=0; n != 20; ++n) {
        int x = 7;
        while(x > 6) 
            x = 1 + rand()/((RAND_MAX + 1u)/6); // 注意: 1+rand()%6 は偏りがある
        printf("%d ",  x); 
    }
}

出力例:

Random value on [0,2147483647]: 448749574
3 1 3 1 4 2 2 1 3 6 4 4 3 1 6 2 3 2 6 1

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 7.22.2.1 rand関数 (p: 252)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.22.2.1 rand関数 (p: 346)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.20.2.1 rand関数 (p: 312)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.10.2.1 rand関数

関連項目

擬似乱数生成器をシードする
(関数)
rand ( ) によって生成可能な最大値
(マクロ定数)