人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

同じ数字を使わないランダムな4桁の整数を表示する
プログラムをC言語でスッキリ書いて欲しいです。

自分で書くとどうしてもフラグを使うような
ちょっと汚いプログラムになってしまいます。

参考までに僕が書いたプログラムを載せておきます。

-----

#include<stdio.h>
#include<time.h>

#define DIGIT 4

int main(void){
int i, j;
int pos = 0;
int num[3];
int rand_num;
int flag = 0;

srand((unsigned)time(NULL));

while(pos < DIGIT) {
rand_num = rand() % 10;
for(i = 0; i < pos; i++) {
if (num[i] == rand_num) {
flag = 1;
break;
}
}

if (flag == 0) {
num[pos] = rand_num;
pos++;
} else {
flag = 0;
}
}

for(j = 0; j < DIGIT; j++) {
printf("%d", num[j]);
}
printf("\n");

return 0;
}


●質問者: kenk
●カテゴリ:学習・教育
✍キーワード:C言語 FLAG PoS Rand Time
○ 状態 :終了
└ 回答数 : 9/9件

▽最新の回答へ

1 ● Mook
●16ポイント

この手の問題は、アルゴリズムの考え方一つだと思います。


今回は、異なる数値しか使わないということは、あらかじめ0?9の数値を用意して、それをランダムに入れ替え先頭から必要な桁数を表示するというアルゴリズムにしてみました。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define DIGIT 4 /* DIGIT は9以下 */
#define SHUFFLE_NUM 1000 /* 入れ替え回数 */

/*-------------------------------------------------------
 * 配列 num の x 番目のデータと y 番目のデータを入れ替え
 *------------------------------------------------------*/
static void swatNum( char *num, int x, int y ) {
 char tmp;
 tmp = num[x];
 num[x] = num[y];
 num[y] = tmp; 
}
/*-------------------------------------------------------
 * DIGIT 桁数の異なる数値を出力
 *------------------------------------------------------*/
void main(void){
 char num[11] = "0123456789";
 int i;

 srand((unsigned)time(NULL));
 for ( i=0 ; i<SHUFFLE_NUM ; i++ )
 swatNum( num, rand() % 10, rand() % 10 );
 num[DIGIT] = NULL;
 printf("%s\n", num );
}

ご参考まで

http://www1.cts.ne.jp/~clab/algorithm/algorithm.html


2 ● tobeoscontinue
●16ポイント
#include<time.h>

#define DIGIT 4

int main(void){
char digits[] = {'0','1','2','3','4','5','6','7','8','9'}, num[5];
int n = 10;
int rand_num, i, m;

srand((unsigned)time(NULL));

for(i = 0; i < DIGIT; i++) {
 rand_num = rand() % n;
 num[i] = digits[rand_num];
 n--;
 for (m = rand_num; m < n; m++) digits[m] = digits[m+1];
}
num[DIGIT] = '\0';
printf("%s\n", num);
return 0;
}

0から9までの文字列を準備します。(digits)

rand_numで一度使った数字はもう使わないのでひとつ詰めます。

この手順の問題は詰めるためのコストです。

詰めないで空白などに置き換えて、空白ならもう一度やり直すと言う手もあるのですが、最悪、終了しないことも有りうる(乱数なのでそんなことはないが)ということで詰める方法にしました。

http://q.hatena.ne.jp/


3 ● castiron
●16ポイント

なるべく踏襲して(これって動きました?numの配列の数が足りる?)


#include<stdio.h>
#include<time.h>

#define DIGIT 4

int main(void){
int i;
int use_num[9]={0,1,2,3,4,5,6,7,8,9}; //重複しないための配列
int num[4];
int rand_num;
int tmp; //一時保存用
int last; //配列の最後の位置

srand((unsigned)time(NULL));
/****************ここをループさせれば何個でも数字を作れる************/
last=9;
for(i=0;i<DIGIT;i++){
   rand_num=(int)rand()%10;
   //使う数字を配列の最後の数字と交換
 tmp=use_num[last];
 use_num[last]=use_num[rand_num];
 use_num[rand_num]=tmp; 
   //必ずlastの位置にある数字を格納するようにする(lastをデクリメントすることで以降使わない)
 num[i]=use_num[last--]; 
}
for(j = 0; j < DIGIT; j++) {
 printf("%d", num[j]);
}
printf("\n");
/****************ここをループさせれば何個でも数字を作れる************/
return 0;
} 

</pre>

http://q.hatena.ne.jp/1185539901

補足もあると思うのでコメントをオープンしてください。


4 ● dungeon-master
●16ポイント

決してキレイとはいえない。

http://q.hatena.ne.jp/ダミー。

#include<stdio.h>
#include<time.h>

#define DIGIT 4

int main(void){

char num[]="0123456789";
int numlen=10;
char cur;
int i;
int rand_num;

srand((unsigned)time(NULL));

for( i=0 ; i< DIGIT ; i++ ){
 rand_num = rand() % numlen;
 cur=num[i];
 num[i]=num[ rand_num ];
 num[rand_num ]= cur;
}

num[DIGIT]=0;
printf("%s\n", num );
return 0;
} 

5 ● Vacuum
●15ポイント

同じ数字で構成されないだけならば、これでいいでしょう。

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main (int argc,char *argv[]) {

int dec;

char str[8];

srand((unsigned)time(NULL));

while(1) {

dec = rand()%10000;

sprintf(str,"%04d\n",dec);

if((str[0] == str[1])||(str[0] == str[2])||(str[0] == str[3]) ||

(str[1] == str[2])||(str[1] == str[3])||(str[2] == str[3])) {

continue;

}

printf(str);

}

return (0);

}

http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B...


1-5件表示/9件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ