乱数の作り方

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

乱数の作り方

#1

投稿記事 by イズミ » 13年前

乱数でー999~999の数字を1つ作りたいのですが、どうすれば下のコードでやると
[error c2059: 構文エラー ’%’]
と出てくるのですがどこか違うのでしょうか?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int a=0;

srand(time(NULL));
a=rand() -999+%1999;

printf("%d",a);

return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 乱数の作り方

#2

投稿記事 by softya(ソフト屋) » 13年前

どう間違っているかは一目で分かったのですが、こう考えてしまった根本を直してもらったほうが良い気がしました。
どういう順位で演算されるか分解してみてもらえますか?
これとこれを引いて、この値をこっちの値で割ってとか説明をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イズミ

Re: 乱数の作り方

#3

投稿記事 by イズミ » 13年前

a=rand() -999+%1999;


aにー999を入れる
a=-999になる
-999のaに0~1998の乱数を入れる

そうすると
乱数が0のとき     -999+0=-999
乱数が1998のとき  -999+1998=999


よってー999~999の乱数が作れる
と考えました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 乱数の作り方

#4

投稿記事 by softya(ソフト屋) » 13年前

考えとしては間違っていないですね。
ただ、C言語の式としては大きく間違っています。

書かれたとおりに記述すると
a = -999;
a = a + (rand() % 1999);
となります。

これをひとまとめにしもて
a=rand() -999+%1999;
とはなりません。

演算順位を当てにせず、演算してもらいたい順位で
a=rand() -999+%1999;
をカッコを使って書きなおしてみてください。
問題点がわかると思います。

例: a = b + 10 / 10; をカッコを使って書くと掛け算割り算が先に計算されるので a = b + (10 / 10);となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イズミ

Re: 乱数の作り方

#5

投稿記事 by イズミ » 13年前

a=rand() -999+%1999;
     ↓
(a=-999)+rand() %1999;

(a=-999)
aに-999を代入する

+rand() %1999;
aに1998までの乱数を入れる



で、いいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 乱数の作り方

#6

投稿記事 by softya(ソフト屋) » 13年前

試してみると分かりますが、
(a=-999)+rand()%1999;
だと実はaは-999にしかなりません。

演算は次のように行われるからです。
(a=-999)でaに-999が代入されます。これは意図通りですね。
で、この後の演算が問題です。
すでに代入演算は完了しているので、(a=-999)は-999と言う値と同じに扱われます。つまりaの代入はもう二度と行われません。
(a=-999)+rand()%1999;

-999+rand()%1999;
と同じなんですね。
でも代入先がないのでこの計算結果は捨てられてしまいます。
結果、求める答えが得られないって事になります。

考え方を変えて、rand()%1999 と -999の演算を先に終わらせて最後にaに代入する式を考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゲスト

Re: 乱数の作り方

#7

投稿記事 by ゲスト » 13年前

a=(-999+rand() %1999);

(-999+rand() %1999);
-999に乱数をたす

上で得た値をaに入れる

Wpa
記事: 11
登録日時: 13年前

Re: 乱数の作り方

#8

投稿記事 by Wpa » 13年前

えーと
簡単に

a-=999+GetRand(1998)

でいいのではないのでしょうか?
あくまで個人的な意見ですので、あしからず

追記:
ああ、すみません
int a=0
が定義されてましたね。。(赤の部分を変更しました)

アバター
ゆーずぃ
記事: 62
登録日時: 13年前
住所: 埼玉県

Re: 乱数の作り方

#9

投稿記事 by ゆーずぃ » 13年前

>a-=999+GetRand(1998)

それだと
a = a-(999+GetRand(1998))
になります。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 乱数の作り方

#10

投稿記事 by bitter_fox » 13年前

Wpa さんが書きました: a-=999+GetRand(1998)
GetRand(int)ってDXライブラリの関数なんでDXライブラリ入れてなかったら使えないんじゃ・・・
ゲスト さんが書きました: a=(-999+rand() %1999);
もう括弧、いらないのだが。
(ゲストさんってイズミさんでしょうか?)

Wpa
記事: 11
登録日時: 13年前

Re: 乱数の作り方

#11

投稿記事 by Wpa » 13年前

bitter_fox さんが書きました:
Wpa さんが書きました: a-=999+GetRand(1998)
GetRand(int)ってDXライブラリの関数なんでDXライブラリ入れてなかったら使えないんじゃ・・・
確かにそうでした。失礼いたしました(_ _)ヾペコリ
それに、この式じゃあ数字になりませんね(文字的な意味で)
a-=999+rang(1998)
ではどうですか?

閉鎖

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