ページ 11

重複しないrand関数

Posted: 2017年10月17日(火) 23:23
by ぺこ
初投稿です。
ネットで重複しないrand関数のソースコードを見つけ、for文を(i=0;i<5)でなく(i=1;i<=5)で回したいのですがうまくいきません。自分で手直ししたところxの値がでたらめになってしまいます。ご指摘お願いします。
code
int main(void){
int i,j;
int x[5];
int y[5];
srand(time(NULL));
for(i=0;i<5;i++){
y=i;
printf("y[%d]=%d \n", i, y);
}

for(i=0;i<5;i++){
x=y[rand()%(5-i)];
printf("-------x[%d]=%d\n",i, x);
for(j=0;j<4;j++){
if(y[j]>=x){
y[j]=y[j+1];
}
}
for(j=0;j<4-i;j++){
printf("y[%d]=%d \n", j, y[j]);
}
//printf("[%d]\n",x);
}
return 0;
}
/code

Re: 重複しないrand関数

Posted: 2017年10月17日(火) 23:27
by みけCAT
ぺこ さんが書きました:for文を(i=0;i<5)でなく(i=1;i<=5)で回したいのですがうまくいきません。自分で手直ししたところxの値がでたらめになってしまいます。ご指摘お願いします。

提示されたソースコードには、(i=1;i<=5)に近い部分が見当たりません、
まずは「xの値がでたらめになってしまう」ソースコードを提示してください。

Re: 重複しないrand関数

Posted: 2017年10月17日(火) 23:53
by ぺこ
以下のソースコードは自分が書き換えたものです。xの値がでたらめになるだけでなく、値を重複してしまう時もあります。

code
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main(void){
int i,j;
int x[5];
int y[5];
srand(time(NULL));
for(i=1;i<=5;i++){
y=i;
printf("y[%d]=%d \n", i, y);
}

for(i=1;i<=5;i++){
x=y[rand()%(6-i)];
printf("-------x[%d]=%d\n",i, x);
for(j=0;j<5;j++){
if(y[j]>=x){
y[j]=y[j+1];
}
}
}
return 0;
}
/code

Re: 重複しないrand関数

Posted: 2017年10月18日(水) 01:14
by みけCAT
int x[5];やint y[5];として宣言された配列の添字の有効範囲は0以上4以下です。
操作する添字の範囲を意識してプログラムを書きましょう。

コード:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main(void){
	int i,j;
	int x[5];
	int y[5];
	srand(time(NULL));
	for(i=1;i<=5;i++){
//		y[i]=i;
		y[i-1]=i;
//		printf("y[%d]=%d \n", i, y[i]);
		printf("y[%d]=%d \n", i, y[i-1]);
	}

	for(i=1;i<=5;i++){
//		x[i]=y[rand()%(6-i)];
		x[i-1]=y[rand()%(6-i)];
//		printf("-------x[%d]=%d\n",i, x[i]);
		printf("-------x[%d]=%d\n",i, x[i-1]);
//		for(j=0;j<5;j++){
		for(j=0;j<4;j++){
//			if(y[j]>=x[i]){
			if(y[j]>=x[i-1]){
				y[j]=y[j+1];
			}
		}
	}
	return 0;
}

Re: 重複しないrand関数

Posted: 2017年10月18日(水) 12:09
by ぺこ
思った通りに動きました。思い通りに動かなかった原因もわかりました。有難うごさいます。

Re: 重複しないrand関数

Posted: 2017年10月19日(木) 22:34
by Dixq (管理人)
見てお分かりと思いますがタグの使い方が間違っています。
codeタグは[と]で囲んでください。