C言語で乱数を生成するときに、例えば1~10の乱数を生成するとして、
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
for(int i = 0; i < 10; i++)
{
x = rand()%10+1;
printf("%d",x);
}
}
のようにすると実行結果が
2 8 5 1 1 0 5 9 9 3 5
のように値が重複していまします。
それを
1 3 9 7 4 6 2 5 8 10
のように値を重複させずに乱数を生成させる方法を教えてください!
よろしくお願いします!
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ちゃんとFisher-Yatesでシャッフルするとこんな感じかと思います。
C
1#include <stdio.h> 2#include <stdlib.h> 3 4void shuffle(int array[], int size) 5{ 6 int i = size; 7 while (i > 1) { 8 int j = rand() % i; 9 i--; 10 int t = array[i]; 11 array[i] = array[j]; 12 array[j] = t; 13 } 14} 15 16int main(int argc, char **argv) 17{ 18 int values[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 19 int size = sizeof(values) / sizeof(int); 20 shuffle(values, size); 21 for (int i = 0; i < size; i++) { 22 printf("%d ", values[i]); 23 } 24 printf("\n"); 25 return 0; 26}
===={1,2,3}で10000000回試行したときの出現回数====
1 2 3: 1665490
1 3 2: 1667148
2 1 3: 1664647
2 3 1: 1666638
3 1 2: 1668634
3 2 1: 1667443
Fisher-Yatesってそんなに難解なアルゴリズムではないはずなのですが、
なぜか間違ってる例をよく見ますね。
投稿2016/02/28 09:25
総合スコア257
0
こんにちは。
一旦配列に0~9まで入れておいて、その配列をシャッフルすると良いと思います。
以下、めめんと!「【C言語/C++】配列をシャッフルしてランダムに入れ替える」からの引用です。
C
1#include<stdlib.h> 2void shuffle(int ary[],int size) 3{ 4 for(int i=0;i<size;i++) 5 { 6 int j = rand()%size; 7 int t = ary[i]; 8 ary[i] = ary[j]; 9 ary[j] = t; 10 } 11}
投稿2016/02/28 05:04
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/28 07:12
2016/02/28 07:45
2016/02/28 08:16
2016/02/28 08:20
2016/02/28 09:04
2016/02/28 09:32 編集
0
私が使っていた教本(「C入門と基本アルゴリズム」西東社、1992)には、こんなアルゴリズムが載っていました。
C
1struct SHUFFLE 2{ 3 int key; 4 int order; 5}randomizer; 6 7int compfunc( const void* a, const void* b ) 8{ 9 struct SHUFFLE* p = (struct SHUFFLE*)a; 10 struct SHUFFLE* q = (struct SHUFFLE*)q; 11 12 if( p->order < q->order ) return -1; 13 if( p->order > q->order ) return 1; 14 return 0; 15} 16 17void shuffle(){ 18 int i; 19 for( i = 0; i < sizeof( randomizer ) / sizeof( randomizer[0] ); i++ ){ 20 randomizer[i].key = i; 21 randomizer[i].order = rand(); 22 } 23 qsort( randomizer, sizeof( randomizer ) / sizeof( randomizer[0] ), 24 sizeof( randomizer[0]), compfunc ); 25}
乱数の質次第ですが、結構均質ですよ。
投稿2016/02/28 09:34
総合スコア1722
0
配列に予め 1 から 10 までの値を入れておき、その中身をランダムに並び替えてから表示したほうが良いでしょう。
lang
1#include <stdio.h> 2#include <stdlib.h> 3 4void shuffle(int array[], int size) 5{ 6 for (int i = 0; i < size; i++) { 7 int j = rand() % size; 8 int t = array[i]; 9 array[i] = array[j]; 10 array[j] = t; 11 } 12} 13 14int main(int argc, char **argv) 15{ 16 int values[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 17 int size = sizeof(values) / sizeof(int); 18 shuffle(values, size); 19 for (int i = 0; i < size; i++) { 20 printf("%d ", values[i]); 21 } 22}
投稿2016/02/28 05:14
総合スコア1610
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/28 09:31 編集
2016/02/28 09:38
2016/02/28 09:51 編集