質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1400閲覧

c言語 配列をシャッフル

kelt22

総合スコア46

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/03/30 11:13

前提・実現したいこと

配列をシャッフルしたいです。

発生している問題・エラーメッセージ

下記のようなコードを書くと要素内に同じ数が出てきてしまいます。なぜこのようになるか解説していただけると有り難いです。

該当のソースコード

c

1#define swap(type, x, y) do { type t = x; x = y; y = t; } while (0) 2 3int main( void ) 4{ 5 int a[8]={1,2,3,4,5,6,7,8}; 6 int i,j; 7 srand(time(NULL)); 8 for(i=7;i>=1;i--){ 9 swap(int,a[i],a[rand()%(i+1)]); 10 } 11 for(j=0;j<8;j++){ 12 printf("%d",a[j]); 13 } 14 return 0; 15}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

マクロは関数と違いただの文字列の置換なので、
swapはこのように置換されてしまいます。

c

1int main( void ) 2{ 3 int a[8]={1,2,3,4,5,6,7,8}; 4 int i,j; 5 srand(time(NULL)); 6 for(i=7;i>=1;i--){ 7 do { int t = a[i]; a[i] = a[rand()%(i+1)]; a[rand()%(i+1)] = t; } while (0); 8 } 9 for(j=0;j<8;j++){ 10 printf("%d",a[j]); 11 } 12 return 0; 13}

rand()が2回呼ばれてしまうので、正しくスワップできません。
事前にどれを交換するのかを変数に格納しておけば解決できます。

c

1int main( void ) 2{ 3 int a[8]={1,2,3,4,5,6,7,8}; 4 int i,j; 5 srand(time(NULL)); 6 for(i=7;i>=1;i--){ 7 int r=rand()%(i+1); 8 swap(int,a[i],a[r]); 9 } 10 for(j=0;j<8;j++){ 11 printf("%d",a[j]); 12 } 13 return 0; 14}

投稿2020/03/30 11:33

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

swap(int,a[i],a[rand()%(i+1)]);が、
do{ int t; t=a[i]; a[i]=a[rand()%(i+1)]; a[rand()%(i+1)]=t; } while(0);
なってしまっています。なので、スワップになってません。

投稿2020/03/30 11:18

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kelt22

2020/03/30 11:24

rand関数が呼びだされるたびに新しい乱数が生成されるので、うまく交換できないという感覚であっていますか?
otn

2020/03/30 11:26

そうです。 swapの前に、rand()%(i+1) を変数に代入して、それを使う必要があります。
kelt22

2020/03/30 12:15

ありがとうございます。理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問