- ベストアンサー
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個の数値に全部乱数を与えて昇順ソート・・・とか かなり面倒なコードになりそうなんで。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#3の補足です。 For k = p To m - i X(k) = X(k + 1) Next を X(p) = X(m - i + 1) だけにしたほうが処理時間が短くなります。 ロジックは変わるけど、ランダムなことは同じです。
その他の回答 (3)
- nag0720
- ベストアンサー率58% (1093/1860)
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
お礼
次の回答と合わせ追試してみました。なーるほど、です。殊にこの p = Int(Rnd * (m - i + 1) + 1) IDX(i) = X(p) X(p) = X(m - i + 1) 3行がキモですね。インデックスの番号そのものを乱数で作ってしまう という発想はありませんでした。50過ぎるとプログラマとして頭が固い んですね(苦笑) 思った通りのことが出来ました。ありがとうございました。
- pakuti
- ベストアンサー率50% (317/631)
連続した整数であれば1番最初と1番最後の数の間で乱数を取れば良いのでは?
お礼
一発目に見た瞬間はイメージがわかなかったんですが。 でも、#3/4さんのコードで、言われることが分かりました。 なるほど、言われてみればそうですね。50過ぎるとやっぱ頭が固い んだと思います。サゼスチョン、ありがとうございました。
- Tasuke22
- ベストアンサー率33% (1799/5383)
> かなり面倒なコードになりそうなんで。 面倒でも書くしか無いでしょう。 ソートは関数があるからいいでしょう。 ・乱数が本当に乱数になる仕組み ・同じ値を取出さない仕組み これだけは書く必要があるでしょう。
お礼
う~む、やっぱり書かなきゃなのかぁ・・・ 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を書きだしてソート なんてやるのはあんまりスマートじゃないし、だからと言ってコード で直接ソートを書くのも大変だし・・・。 どうも「引導を渡して」(苦笑)くれたみたいですが、私の結論に近い ということが分かっただけでも良いです。ありがとうございました。 でも、なんかもっといい方法、ないのかなあ・・・。
お礼
これだけ↓でもよかったのに For k = p To m - i X(k) = X(k + 1) Next ここまで↓考えて頂いてありがとうございました。 とくにこの発想は「目から鱗」でした。 X(p) = X(m - i + 1) #3の回答と合わせ、こちらに20pt付けさせていただきます。