配列の要素にランダムで入力

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

配列の要素にランダムで入力

#1

投稿記事 by マコトスパルビエロ » 11年前

初めまして。遺伝的アルゴリズムを使って最適配置を探すプログラムをC++にて作ろうとしています。
配列a[500]にランダムで0か1を入力し、要素が1ならばそこに配置というように符号化を考えています。
今回、配置する箇所の数的制限を作って、その数以内で配置したいと考えています。
つまり、a[500]の要素のうち、1の入る箇所をたとえば150箇所以内としたいのです。

私の考えた方法は、
①配列a[500]にランダムに0、1を入力
②配列a[500]の要素の総和を計算
③②の総和が150以上の場合、配列のどこかを(ランダムで)0に置き換える
④②へ繰り返し
という形です。

この方法の③の箇所、「配列のどこかを(ランダムで)0に置き換える」ことをしたいのですが、どのような方法がありますでしょうか?
また、上記の方法はとても効率的には見えません。もっと効率の良い方法があれば教えていただけると幸いです。

なお、配列内の要素の順番は入れ替えることはできません。(最適配置を探しているため)
また、0、1がすでにランダムで入力された状態であることが前提です。配列に入力する段階での工夫はできません。(アルゴリズム内で交叉させるため)

以上になります。お時間があれば返信をよろしくお願いします。

non
記事: 1097
登録日時: 13年前

Re: 配列の要素にランダムで入力

#2

投稿記事 by non » 11年前

質問ですが、1にする箇所が150未満であればいくらでもいいのですか?
例えば、常に149でも。
それとも、何らかの分布がありますか?
non

マコトスパルビエロ

Re: 配列の要素にランダムで入力

#3

投稿記事 by マコトスパルビエロ » 11年前

ご質問ありがとうございます。
この場合、150という基準は一定の整数です。
わかりにくくて申し訳ありません。

マコトスパルビエロ

Re: 配列の要素にランダムで入力

#4

投稿記事 by マコトスパルビエロ » 11年前

常に149でも構いません。
1の個数は1~150のいずれかになれば大丈夫です。
よろしくお願いします。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: 配列の要素にランダムで入力

#5

投稿記事 by Tatu » 11年前

この方法はどうでしょうか?

1.a[500]のうちa[0]を1、a[1~149]をランダムに0か1とし、残りを0とする。
2.aの中身をシャッフルする。

コード
► スポイラーを表示

マコトスパルビエロ

Re: 配列の要素にランダムで入力

#6

投稿記事 by マコトスパルビエロ » 11年前

わざわざソースまでありがとうございます。
残念ながら、シャッフルする点で私の考えているものとズレが生じています。
配列に含まれる1、0は設備の配置を表しているため、順序を変えることはできません。
ランダムにa[500]まで0か1がすでにびっしり埋まっている状態から、工夫をしなければなりません。
すでに配列に含まれている1のうち、150個を超えた分をどうにかしてランダムで0に変換したいのです。

丁寧に書いていただいたのに、申し訳ないです。
わかりにくい問題ですいません。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 配列の要素にランダムで入力

#7

投稿記事 by beatle » 11年前

0以上499以下の整数をランダムに150個生成し、その生成した整数をaの添字に使う方法はいかがでしょう。

コード:

for (i = 0; i < 150; ++i) {
    r = rand() % 500;
    a[r] = 1;
}

たいちう
記事: 418
登録日時: 13年前

Re: 配列の要素にランダムで入力

#8

投稿記事 by たいちう » 11年前

②で1の個数を数えながら、vector<int>に1のindexをpush_back。
vectorをrandom_shuffle。
150を超えた分だけ、vectorの先頭のindexが指す要素を0にする。

マコトスパルビエロ

Re: 配列の要素にランダムで入力

#9

投稿記事 by マコトスパルビエロ » 11年前

beatleさんの方法でできるようです!
ありがとうございます!
その他、返信していただいた方々、返信しようと考えてくださった方々、ありがとうございました。
非常に助かりました。
難しいことではなかったですが、自分ではなかなか思いつけませんでした。
重ねてお礼申し上げます。

閉鎖

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