配列内に格納した文字列の選択方法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
金柑

配列内に格納した文字列の選択方法について

#1

投稿記事 by 金柑 » 10年前

タイトルの通りなのですが、

string[] str1 = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" };

のように配列内に文字を格納し、その中からランダムに2つを選択し、その文字を出力する(このとき、2つは同じものではあってはダメ)。
次に、先ほど選択した2つとは異なる2つの文字をランダムに選択する。
ということを、配列内に格納されている全ての文字において行いたいのですが、どのようなアルゴリズム(?)であればこのようなことが実現できるのでしょうか?

質問が分かりにくいかもしれませんが、回答よろしくお願いします。
(使用言語はC#です)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 配列内に格納した文字列の選択方法について

#2

投稿記事 by みけCAT » 10年前

配列(もしくはそのコピー)全体をシャッフルし、前から2個ずつ取っていく、というのはどうですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

金柑

Re: 配列内に格納した文字列の選択方法について

#3

投稿記事 by 金柑 » 10年前

回答ありがとうございます!

教えて頂いたアルゴリズムで試してみたところ成功しました!
こういうのを考えるのはセンスが必要なのだなーと感じました。
これからも頑張って勉強していきたいと思います。
ありがとうございました。

かずま

Re: 配列内に格納した文字列の選択方法について

#4

投稿記事 by かずま » 10年前

シャッフルって時間かかりますよね。
もっと簡単にできます。

配列の要素数が 10 だとしたら、
乱数により、その 10個から 1個選んで取り出します。
選んだその位置に最後の 1個を移します。
乱数により、その 9個から 1個選んで取り出します。
これで、異なる 2個が取り出せます。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 配列内に格納した文字列の選択方法について

#5

投稿記事 by みけCAT » 10年前

かずま さんが書きました:シャッフルって時間かかりますよね。
もっと簡単にできます。

配列の要素数が 10 だとしたら、
乱数により、その 10個から 1個選んで取り出します。
選んだその位置に最後の 1個を移します。
乱数により、その 9個から 1個選んで取り出します。
これで、異なる 2個が取り出せます。
これと似た手順、すなわち
まず10個の中から適当に1個選び、先頭の要素と交換する。
2番目~10番目の要素の中から適当に1個選び、2番めの要素と交換する。
3番目~10番目の要素の中から適当に1個選び、3番めの要素と交換する。
・・・
の繰り返しで、O(n)でシャッフルできます。
したがって、気にするほどの時間の差は無いと考えられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 配列内に格納した文字列の選択方法について

#6

投稿記事 by かずま » 10年前

すみません。
最初の質問を早とちりして、2個だけ取り出すものと勘違いしていました。
2個ずつ、配列の要素全部を取り出すのであれば、シャッフルと同じです。

閉鎖

“C言語何でも質問掲示板” へ戻る