ページ 1 / 1
配列内に格納した文字列の選択方法について
Posted: 2014年11月02日(日) 23:40
by 金柑
タイトルの通りなのですが、
string[] str1 = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" };
のように配列内に文字を格納し、その中からランダムに2つを選択し、その文字を出力する(このとき、2つは同じものではあってはダメ)。
次に、先ほど選択した2つとは異なる2つの文字をランダムに選択する。
ということを、配列内に格納されている全ての文字において行いたいのですが、どのようなアルゴリズム(?)であればこのようなことが実現できるのでしょうか?
質問が分かりにくいかもしれませんが、回答よろしくお願いします。
(使用言語はC#です)
Re: 配列内に格納した文字列の選択方法について
Posted: 2014年11月02日(日) 23:43
by みけCAT
配列(もしくはそのコピー)全体をシャッフルし、前から2個ずつ取っていく、というのはどうですか?
Re: 配列内に格納した文字列の選択方法について
Posted: 2014年11月03日(月) 16:48
by 金柑
回答ありがとうございます!
教えて頂いたアルゴリズムで試してみたところ成功しました!
こういうのを考えるのはセンスが必要なのだなーと感じました。
これからも頑張って勉強していきたいと思います。
ありがとうございました。
Re: 配列内に格納した文字列の選択方法について
Posted: 2014年11月03日(月) 16:54
by かずま
シャッフルって時間かかりますよね。
もっと簡単にできます。
配列の要素数が 10 だとしたら、
乱数により、その 10個から 1個選んで取り出します。
選んだその位置に最後の 1個を移します。
乱数により、その 9個から 1個選んで取り出します。
これで、異なる 2個が取り出せます。
Re: 配列内に格納した文字列の選択方法について
Posted: 2014年11月03日(月) 17:17
by みけCAT
かずま さんが書きました:シャッフルって時間かかりますよね。
もっと簡単にできます。
配列の要素数が 10 だとしたら、
乱数により、その 10個から 1個選んで取り出します。
選んだその位置に最後の 1個を移します。
乱数により、その 9個から 1個選んで取り出します。
これで、異なる 2個が取り出せます。
これと似た手順、すなわち
まず10個の中から適当に1個選び、先頭の要素と交換する。
2番目~10番目の要素の中から適当に1個選び、2番めの要素と交換する。
3番目~10番目の要素の中から適当に1個選び、3番めの要素と交換する。
・・・
の繰り返しで、O(n)でシャッフルできます。
したがって、気にするほどの時間の差は無いと考えられます。
Re: 配列内に格納した文字列の選択方法について
Posted: 2014年11月03日(月) 19:10
by かずま
すみません。
最初の質問を早とちりして、2個だけ取り出すものと勘違いしていました。
2個ずつ、配列の要素全部を取り出すのであれば、シャッフルと同じです。