rand関数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

rand関数

#1

投稿記事 by » 15年前

いつも、お世話になっています。
現在、C言語の初心者のテキストを見ながら進めています。
WindowsのVistaを使っています。

数を当てさせるプログラムを作っているのですが、その中で-999から999の整数を
rand関数を用いて生成するのですが、rand関数は0以上の整数しか生成できないのですよね?

どうしたら、負の整数を生成できるのですか?
アドバイスをお願いします。

Mato

Re:rand関数

#2

投稿記事 by Mato » 15年前

 例えば、0~1999までの数字をrandで生成した後、1000引けばいいんじゃないでしょうか。
int x = rand() % 1999 - 1000;
ですかね。
(確認してません)

Mist

Re:rand関数

#3

投稿記事 by Mist » 15年前

別解

1. int配列1999個作って-999から999までセットする
2. randで0~1998までの乱数を発生させる
3. 乱数を添え字にして配列の値を使用する

KEYONN_

Re:rand関数

#4

投稿記事 by KEYONN_ » 15年前

Mistさんへ
0-1999ってことは、int配列2000個ではないでしょうか?

勘違いでしたら、すみません。

s-rush

Re:rand関数

#5

投稿記事 by s-rush » 15年前

>>TKOZさん
配列の個数は1999個であってると思いますよ。
なぜなら2000で考えると”0”を2度含んでしまっています。
ですので、配列の個数は2000から重複している”0”1個分を引いた1999個です。

Ma

Re:rand関数

#6

投稿記事 by Ma » 15年前

>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)

が一番良いかと。

s-rush

Re:rand関数

#7

投稿記事 by s-rush » 15年前

負の整数を作るのであれば、単純に-1を掛けてもいいんではないですか?
乱数で、0~999の整数を生成する。
同じく乱数で、0なら1、1なら-1を掛ける。

このようにしても乱数は作れると思います。

Ma

Re:rand関数

#8

投稿記事 by Ma » 15年前

>範囲は、-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()は整数値を返すと仮定しています。)

SooA

Re:rand関数

#9

投稿記事 by SooA » 15年前

rand が 0 を返した場合 = 0-999 = -999
rand が 999 を返した場合 = 999-999 = 0
rand が 1998 を返した場合 = 1998-999 = 999

実際に rand が最小値、最大値を出したときの計算を
行ってみるといいですね。

Mato

Re:rand関数

#10

投稿記事 by Mato » 15年前

 本当ですね、”-999”ですね。
失礼しました……;

Re:rand関数

#11

投稿記事 by » 15年前

1. int配列1999個作って-999から999までセットする
2. randで0~1998までの乱数を発生させる
3. 乱数を添え字にして配列の値を使用する

この乱数の値を添え字にするということは、どういうことなのでしょうか?

ans = rand() % 1999;

num[ans];
添え字を変数にすることはできないですよね。

バグ

Re:rand関数

#12

投稿記事 by バグ » 15年前

試してみましたか?

SooA

Re:rand関数

#13

投稿記事 by SooA » 15年前

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関数

#14

投稿記事 by » 15年前

>>試してみましたか?
試していませんでした・・・
試したら、出来ました(^^;

閉鎖

“C言語何でも質問掲示板” へ戻る