ここから本文です

int [] data = new int[10]; int tmp,x,y; void setup(){ for(int i = 0;i < d...

pig********さん

2017/9/1213:54:43

int [] data = new int[10];
int tmp,x,y;
void setup(){
for(int i = 0;i < data.length; i++){
data[i] = i+1;
}
for(int k = 0;k<1000;k++){
x = int( random(0,red.lengt

h) );
y = int( random(0,red.length) );
tmp = data[x];
data[x] = data[y];
data[y] = tmp;

}
}

これでサイズNのint型の配列dataの各要素を重複なく初期化することができますが、どういう考え方をすれば理解できるか、分かりません。k <1000 のところは任意の数字でかまわないようですが、なぜどんな数字でもできるかも理解できません。考え方を教えてください。

閲覧数:
42
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

cd6********さん

2017/9/1220:13:38

交換する添字ふたつを乱数で選んでいます。

この方法は公平なシャッフルになりません。
http://d.hatena.ne.jp/bellbind/20081105/1225886625
すでに回答のあるフィッシャー - イェーツのシャッフルアルゴリズムを
使いましょう。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

n2q********さん

2017/9/1217:34:19

『どういう考え方をすれば理解できるか、分かりません。』

data[0] = 1, data[1] = 2, data[3] = 3, ...

こういう風にデータを用意して、あとは、data[x] ←→ data[y] を入れ替えてるんですね。x と y は乱数です。


『k <1000 のところは任意の数字でかまわないようですが、なぜどんな数字でもできるかも理解できません。考え方を教えてください。』

データを用意したときにすでに重複が無いわけですよ。あとはデータの入れ替えを何回行うかだけ。1回も入れ替えを行わなくても、それはそれで構いません。ただ、値が綺麗な順番のままになってるという気持ち悪さがあるだけです。

データ入れ替えの回数が多くなれば、それなりにバラバラとなって気持ち的にも落ち着くでしょう。

prwssさん

2017/9/1215:21:31

>考え方を教えてください

大抵の言語では、(配列の)shuffleと呼ばれています

順番に入れてから、後で混ぜればいいだけだからです

***

人によっては、こちらのアルゴリズムの方が分かりやすいかもしれません

フィッシャー - イェーツのシャッフル - Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%83%E3%82%B7%...

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる