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