 rand関数は、ゲーム作りなどに欠かせない関数ですが、VS2005では、この関数の新バージョンもあります。
rand関数は、ゲーム作りなどに欠かせない関数ですが、VS2005では、この関数の新バージョンもあります。
rand_s関数がそれです。rand関数の場合は、乱数の種をまかないと、いつも同じパターンの乱数しか発生しませんでしたが、rand_s関数は種まきが不要です。ちょっと便利になりました。
#include <stdlib.h> errno_t rand_s(unsigned int* randomValue);この関数を使うには、ソースファイルの最初に
#define _CRT_RAND_Sのように_CRT_RAND_Sをdefineする必要があります。
randomValueは、発生する乱数を受け取る変数へのポインタです。 乱数は0からUINT_MAXまでの間の整数値です。
関数が失敗するとEINVALを返します。この定数を使うにはerrno.hをインクルードする必要があります。
では、簡単な例を見てみましょう。
/* rand01.c */
#define _CRT_RAND_S
#include <stdlib.h>
#include <stdio.h>
int main()
{
    unsigned int rno;
    int err_no, i;
    for (i = 0; i < 10; i++) {
        err_no = rand_s(&rno);
        if (err_no != 0)
            break;
        printf("%u\n", rno);
    }
    return 0;
}
実行結果は次のようになります。
 実行ごとに、表示される数字は異なります。
実行ごとに、表示される数字は異なります。
では、次にこの関数を利用して簡単な数当てゲームを作ってみましょう。
このプログラムでは、EINVAL定数を使っていますので、errno.hをインクルードしています。
/* rand02.c */
#define _CRT_RAND_S
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main()
{
    unsigned int urandno, uAns, inAns;
    char szAns[32];
    
    while (1) {
        if (rand_s(&urandno) == EINVAL) {
            printf("error!\n");
            return -1;
        }
        uAns = urandno % 100;
        while (1) {
            printf("0-99までの整数---- ");
            gets_s(szAns, sizeof(szAns));
        
            inAns = atoi(szAns);
            if (uAns < inAns) 
                printf("大きすぎます\n");
            else if (uAns > inAns)
                printf("小さすぎます\n");
            else {
                printf("正解です\n");
                break;
            }
        }
        printf("続けますか(Y/N) --- ");
        gets_s(szAns, sizeof(szAns));
        if (strcmp(szAns, "N") == 0 || strcmp(szAns, "n") == 0)
            break;
    }
    return 0;
}
実行結果は次のようになります。
 何回目で正解になったかも表示するようにプログラムを工夫してみてください。
何回目で正解になったかも表示するようにプログラムを工夫してみてください。
Update Aug/07/2006 By Y.Kumei