ページ 1 / 1
rand関数
Posted: 2009年3月29日(日) 09:28
by 昴
いつも、お世話になっています。
現在、C言語の初心者のテキストを見ながら進めています。
WindowsのVistaを使っています。
数を当てさせるプログラムを作っているのですが、その中で-999から999の整数を
rand関数を用いて生成するのですが、rand関数は0以上の整数しか生成できないのですよね?
どうしたら、負の整数を生成できるのですか?
アドバイスをお願いします。
Re:rand関数
Posted: 2009年3月29日(日) 09:40
by Mato
例えば、0~1999までの数字をrandで生成した後、1000引けばいいんじゃないでしょうか。
int x = rand() % 1999 - 1000;
ですかね。
(確認してません)
Re:rand関数
Posted: 2009年3月29日(日) 09:47
by Mist
別解
1. int配列1999個作って-999から999までセットする
2. randで0~1998までの乱数を発生させる
3. 乱数を添え字にして配列の値を使用する
Re:rand関数
Posted: 2009年3月29日(日) 10:22
by KEYONN_
Mistさんへ
0-1999ってことは、int配列2000個ではないでしょうか?
勘違いでしたら、すみません。
Re:rand関数
Posted: 2009年3月29日(日) 10:47
by s-rush
>>TKOZさん
配列の個数は1999個であってると思いますよ。
なぜなら2000で考えると”0”を2度含んでしまっています。
ですので、配列の個数は2000から重複している”0”1個分を引いた1999個です。
Re:rand関数
Posted: 2009年3月29日(日) 10:51
by Ma
>int x = rand() % 1999 - 1000; //(rand は0~1999)
これだと、rand() が 1999 であるときと、 0であるときの xの値は両方とも 0 になるため
結果的には、 2000 -1 で、 1999個。
範囲は、-1000 <= x <= 999 になってしまうのでは?
int x = rand() - 999; //(rand は 0~1998)
が一番良いかと。
Re:rand関数
Posted: 2009年3月29日(日) 10:52
by s-rush
負の整数を作るのであれば、単純に-1を掛けてもいいんではないですか?
乱数で、0~999の整数を生成する。
同じく乱数で、0なら1、1なら-1を掛ける。
このようにしても乱数は作れると思います。
Re:rand関数
Posted: 2009年3月29日(日) 10:55
by Ma
>範囲は、-1000 <= x <= 999 になってしまうのでは?
すいません誤りでした。
>int x = rand() % 1999 - 1000; //(rand は0~1999)
正しくは、 -1000 <= x <= 998
に、ならないでしょうか?
rand % 1999 の最小値は、 0 最大値は 1998 ですので
0- 1000 <= x <= 1998 - 1000
すなわち
-1000 <= x <= 998
だと思いました。
(rand()は整数値を返すと仮定しています。)
Re:rand関数
Posted: 2009年3月29日(日) 11:30
by SooA
rand が 0 を返した場合 = 0-999 = -999
rand が 999 を返した場合 = 999-999 = 0
rand が 1998 を返した場合 = 1998-999 = 999
実際に rand が最小値、最大値を出したときの計算を
行ってみるといいですね。
Re:rand関数
Posted: 2009年3月29日(日) 20:19
by Mato
本当ですね、”-999”ですね。
失礼しました……;
Re:rand関数
Posted: 2009年3月30日(月) 02:06
by 昴
1. int配列1999個作って-999から999までセットする
2. randで0~1998までの乱数を発生させる
3. 乱数を添え字にして配列の値を使用する
この乱数の値を添え字にするということは、どういうことなのでしょうか?
ans = rand() % 1999;
num[ans];
添え字を変数にすることはできないですよね。
Re:rand関数
Posted: 2009年3月30日(月) 08:24
by バグ
試してみましたか?
Re:rand関数
Posted: 2009年3月30日(月) 08:26
by SooA
int i, num[1999] ;
// 配列に -999~999までの値をセット
for( i=0; i<1999; i++ )
num = i-999 ;
ans = num[ rand() % 1999 ] ;
rand が 0 を返した場合 = num[0]の値 = -999
rand が 999 を返した場合 = num[999]の値 = 0
rand が 1998 を返した場合 = num[1998]の値 = 999
rand が出した値に対応した配列値を引き出すという事です。
Re:rand関数
Posted: 2009年3月30日(月) 10:23
by 昴
>>試してみましたか?
試していませんでした・・・
試したら、出来ました(^^;