みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBAプログラムのアイデア

Excel-VBAで、以下のような事をしたいんですが、何かスマートなアイデア
やコードは考えられませんか? なるべく短いコードが良いのですが。

1,2,・・・m の連続した整数値があり、その中からn個の数値を
ランダムに抽出して並べる方法です。

例えば、m=10、n=5とした場合、配列 IDX(5) に
IDX(1)=7
IDX(2)=2
IDX(3)=5
IDX(4)=9
IDX(5)=1
こんな感じで並べられると良いんですが・・・。

私が考えると、m個の数値に全部乱数を与えて昇順ソート・・・とか
かなり面倒なコードになりそうなんで。

投稿日時 - 2009-12-10 14:49:55

QNo.5512078

困ってます

質問者が選んだベストアンサー

#3の補足です。

For k = p To m - i
X(k) = X(k + 1)
Next

X(p) = X(m - i + 1)
だけにしたほうが処理時間が短くなります。
ロジックは変わるけど、ランダムなことは同じです。

投稿日時 - 2009-12-11 03:54:38

お礼

これだけ↓でもよかったのに

For k = p To m - i
X(k) = X(k + 1)
Next

ここまで↓考えて頂いてありがとうございました。
とくにこの発想は「目から鱗」でした。

X(p) = X(m - i + 1)

#3の回答と合わせ、こちらに20pt付けさせていただきます。

投稿日時 - 2009-12-11 09:13:30

ANo.4

このQ&Aは役に立ちましたか?

23人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

m個の配列を別に設定していいのなら、次のようなコードで作成できます。

Dim IDX(5)
Dim X(10)
m = 10
n = 5
For i = 1 To m
RD(i) = i
Next i
Randomize
For i = 1 To n
p = Int(Rnd * (m - i + 1) + 1)
IDX(i) = X(p)
For k = p To m - i
X(k) = X(k + 1)
Next
Next

投稿日時 - 2009-12-11 03:01:33

お礼

次の回答と合わせ追試してみました。なーるほど、です。殊にこの

p = Int(Rnd * (m - i + 1) + 1)
IDX(i) = X(p)
X(p) = X(m - i + 1)

3行がキモですね。インデックスの番号そのものを乱数で作ってしまう
という発想はありませんでした。50過ぎるとプログラマとして頭が固い
んですね(苦笑)

思った通りのことが出来ました。ありがとうございました。

投稿日時 - 2009-12-11 09:11:21

ANo.2

連続した整数であれば1番最初と1番最後の数の間で乱数を取れば良いのでは?

投稿日時 - 2009-12-10 18:00:43

お礼

一発目に見た瞬間はイメージがわかなかったんですが。

でも、#3/4さんのコードで、言われることが分かりました。
なるほど、言われてみればそうですね。50過ぎるとやっぱ頭が固い
んだと思います。サゼスチョン、ありがとうございました。

投稿日時 - 2009-12-11 09:06:59

ANo.1

> かなり面倒なコードになりそうなんで。

面倒でも書くしか無いでしょう。
ソートは関数があるからいいでしょう。
・乱数が本当に乱数になる仕組み
・同じ値を取出さない仕組み
これだけは書く必要があるでしょう。

投稿日時 - 2009-12-10 15:44:39

お礼

う~む、やっぱり書かなきゃなのかぁ・・・

dat(1,1)=rnd : dat(2,1)=1
dat(1,2)=rnd : dat(2,2)=2
:

ってやって、dat(1,x)でソート、dat(2,1)~dat(2,n)を引っ張り出す
んですよね。でもソートって、ワークシートにdatを書きだしてソート
なんてやるのはあんまりスマートじゃないし、だからと言ってコード
で直接ソートを書くのも大変だし・・・。

どうも「引導を渡して」(苦笑)くれたみたいですが、私の結論に近い
ということが分かっただけでも良いです。ありがとうございました。

でも、なんかもっといい方法、ないのかなあ・・・。

投稿日時 - 2009-12-10 16:16:31

あなたにオススメの質問