ページ 1 / 1
ランダムに数字を並べる
Posted: 2011年9月22日(木) 13:34
by MASSA
1~5までの数字を
変数 int x1~x5
にランダムに入れたいと思っています。
例えば、
x1=2;
x2=5;
x3=3;
x4=1;
x5=4;
のような具合です。
乱数を使って上手い具合にコードが書けると思っていたのですが…思いつきません(汗)
このコードは、ゲームの中に組み込んで、起動するたびにx1~x5の値が変化するようにするつもりです。
また、いずれは1~25までに拡張したいと思っています。
どなたか、上手いコードを教えていただけないでしょうか…
ライブラリは DXライブラリです。
windows7
VC++2008
Re: ランダムに数字を並べる
Posted: 2011年9月22日(木) 14:45
by jay
X1~X5の部分を配列にすればさして問題はなくなると思いますね
但しx0という余計なデータが出来てしまいますが・・・
コード:
int x[6];
for(int n=1; n<=5; n++)
{
x[n] = GetRand(4)+1;
}
0~4までの数値を取得し、それに+1することで1~5の値を得ることが出来ます。
ただしこの方法を使った場合
x[1]=2
x[2]=1
x[3]=5
x[4]=2
x[5]=3
のように、同じ数値が出てくることもあります。
同じ数値が配置されると困る場合は、取得した数値をチェックし2度取得しないようにする必要があるでしょうね。
Re: ランダムに数字を並べる
Posted: 2011年9月22日(木) 15:05
by MASSA
>jayさん
なるほど。
配列で全く問題はありません
ただ…同じ数字が入力されるのは困ってしまいます…
今のところ、いちいちチェックするのでも良さそうですが…将来的に、扱う数値の数が大きくなっていくと、かなりややこしいことになりそうです。
…もう少し汎用性の高いコードをいただけると、よりうれしいのですが…
Re: ランダムに数字を並べる
Posted: 2011年9月22日(木) 15:55
by かずま
MASSA さんが書きました:
…もう少し汎用性の高いコードをいただけると、よりうれしいのですが…
コード:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int *x, int n)
{
int i, j, t;
for (i = 0; i < n; i++) {
j = rand() % 4;
t = x[i], x[i] = x[j], x[j] = t;
}
}
int main(void)
{
int i, x[] = { 1, 2, 3, 4, 5 };
srand(time(0));
shuffle(x, 5);
for (i = 0; i < 5; i++) printf(" %d", x[i]);
printf("\n");
return 0;
}
Re: ランダムに数字を並べる
Posted: 2011年9月22日(木) 15:57
by YuO
同一の値を入れたくない場合だと,シャッフルするのがよいと思います。
[結] 2005年10月 - 結城浩の日記 # 音楽シャッフル・クイズ(解答編)を元に……。
コード:
void shuffle(int * array, int length)
{
int i; /* C99なら各々のfor文の方で宣言すべきかと */
for (i = 0; i < length; ++i) array[i] = i;
for (i = 0; i < length - 1; ++i)
{
int r;
int temp;
r = i + rand() % (length - i); /* 手抜き。明らかに偏るので注意。 */
temp = array[i];
array[i] = array[r];
array[r] = temp;
}
}
あたりで動くかと。
Re: ランダムに数字を並べる
Posted: 2011年9月22日(木) 15:57
by かずま
Re: ランダムに数字を並べる
Posted: 2011年9月22日(木) 18:49
by MASSA
>かずまさん
>YuOさん
ご丁寧にどうもありがとうございます!
早速試してみます。