• ベストアンサー

配列 シャッフルの高速化をするには?

お世話になります。 私は今10万個の数字を配列に格納し シャッフルしていく問題を抱えております。 下記のプログラムだと 時間がかかりすぎて実用にたえません。 速くするにはどうすればよろしいでしょうか? Dim colBefore As Collection Dim colAfter As Collection Dim i As Long Set colBefore = New Collection Set colAfter = New Collection For i = 1 To 13 colBefore.Add CStr(i) Next Do Until colBefore.Count = 0 i = Int(Rnd(1) * (colBefore.Count - 1)) + 1 colAfter.Add colBefore.Item(i) colBefore.Remove i Loop For i = 1 To 13 Debug.Print colAfter.Item(i) Next

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

  • ベストアンサー
  • tak2003
  • ベストアンサー率32% (174/540)
回答No.2

データだけDBで処理して、必要な分だけVBに渡すのが一番手っ取り早いと思います。 また、10万件のデータを毎回10万件必要なのかも重要です。 1回の処理で100/100000だけしかいらない場合は100件しか処理しないでいいのでもっと速くなると思います。 もっと仕様の提示をお願いします。

googole
質問者

補足

あぁ、なるほど。 DBですね。ということはvisual basicじゃなくてもいいのか・・・。phpで行ってみることにします。 必要なのは1回だけ必要なんですよ。 テキストファイルに一から十万までの数字をシャッフルして書きたいんですよね。

その他の回答 (1)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

実行に時間のかからない部分を工夫してもしょうがないので、まずどの部分の実行に時間がかかっているのかを知る必要があります。(これをプロファイリングと言います。) そのプログラムのうち、どの行(ステートメントあるいはメソッド)の実行に時間がかかっていますか? まだ調べていないのであれば、まずそれを調べて教えてください。

googole
質問者

補足

ご丁寧にお返事ありがとうございます。 どこが時間がかかってるんでしょう・・・ このコードの意味もよくわかってないので(笑) 逝って来ます・・・・orz

関連するQ&A

  • Collectionによる多次元配列

    VBAでCollectionを二つ使用し、 値が入ったCollectionをもう片方のCollectionに入れて2次元配列のようにしたいのですが、 やり方がいまいちわかりません。 確か昔にそういった使い方をした記憶があるのですが、 ネットで調べてもみかけないので困っています。 Dim colA As Collection Dim colB As Collection Set colA = New Collection Set colB = New Collection colB.Add ("A") colB.Add ("B") colB.Add ("C") ※ colA.Item(1) = colB. Set colA = Nothing Set colB = Nothing 上記の※の箇所をどうすれば入れられるのでしょうか。 宜しくお願い致します。

  • マクロの改ページの追加について。

    下記コードに、E列を上から見て値が変わったら改ページ、を追加したいのですが、上手くできません。 A列、D列のみの下記コードでは成功します。 ちなみにE列は日付なんですが、A列D列同様にコードを書き足すだけではダメなんでしょうか?? 以前こちらで質問させて頂いて、回答を頂いたコードで、私自身完璧に内容を理解できていないので、追加の仕方もわからない状況です。 よろしくお願い致します。 Sub test() Dim rng As Range Dim objA As New Collection Dim objD As New Collection Dim strA As String Dim strD As String Dim blnBreak As Boolean ' 改ページを全て解除 Activesheet.ResetAllPageBreaks Activesheet.PageSetup.PrintArea ="$A:$K" For Each rng In Range("A:A") strA = CStr(rng.Value) strD = CStr(rng.Offset(0, 3).Value) ' コレクションに追加(同じデータはスキップする) On Error Resume Next objA.Add strA, strA objD.Add strD, strD On Error GoTo 0 If objA.Count = 2 Then ' A列の 2つ目のコレクションで改ページ blnBreak = True ' コレクションをリセット Set objA = New Collection Set objD = New Collection objA.Add strA, strA objD.Add strD, strD Else If objD.Count = 4 Then ' D列の 4つ目のコレクションで改ページ blnBreak = True ' コレクションをリセット Set objA = New Collection Set objD = New Collection objA.Add strA, strA objD.Add strD, strD Else blnBreak = False End If End If ' 改ページ挿入 If blnBreak Then Activesheet.HPageBreaks.Add rng End If Next End Sub

  • VBA なぜ配列にドカンと一発で入れることが出来る

    下に2つのコードを示していますが、パターン1は、配列cに一発で一気に速く入れることが出来る雰囲気が表れています。実際に速いそうです。 しかしながら、どちらのコードも、最終的には配列cに一つずつデータが入るわけですよね。 なぜ、パターン1だと速いのでしょうか? 専門的でむずかしいようでしたら、イメージだけでも教えていただけたらと思います。 パターン1 Dim r as Range Dim c() As Variant Set r=Selection c = r.Value パターン2 redim c(r.rows.count,r.columns.count) for i=1 to r.rows.count for j=1 to r.columns.count c(i,j)=r(i,j).value next j next i

  • For Each ~ Next の動作

    コレクションの操作をするときなどに、 For tmp in testCol   List1.Add tmp Next ってな感じでFor Each文をつかいますよね。 あれって、 For i = 0 To testCol.Count   List1.Add testCol.Item(i) Next i と書くのに比べ、びっくりするほど処理が速いですよね。 いったい、どんな違いがあるのでしょうか。

  • VC++でオブジェクトのコレクション格納

    すみません。 教えてください。 VC++言語を勉強しているのですが、不明点があるため教えていただきたいのです。 <VBサンプル> Set Col = new Collection For i = 1 To nMaxCount Set objIF = New iniFile 'iniファイル設定クラス With objIF .iniDirPath = mstriniDirPath .iniFileName = mstriniFileName nResult = .iniStart 'クラスの実行関数 If nResult < 0 Then iniReadRecStack = nResult Exit For End If ' コレクションにiniファイルクラスオブジェクトを格納する。 col.Add objIF, CStr(Count) Next 上記のようなことをVC++でやりたいのですが、可能でしょうか。 もしよければ、コレクションに格納する方法を教えてください。 よろしくお願いします。

  • フォームからテーブルへの転記

    下記はフォームに入力した項目をテーブルに転記するコードです。 Private Sub CommandButton1_Click() Dim ws As Worksheet Dim tbl As ListObject Dim newRow As ListRow Dim lastRow As Long Dim i As Long Set ws = Worksheets("シート1") Set tbl = ws.ListObjects("テーブル") ' Find the last row in the table lastRow = tbl.ListRows.Count + 1 ' Add a new row to the table Set newRow = tbl.ListRows.Add(lastRow) ' Add the data to the new row newRow.Range.Cells(1, 1).Value = tbl.ListRows.Count For i = 1 To 7 newRow.Range.Cells(1, i + 1).Value = Me.Controls("TextBox" & i).Value Next i ' Clear the form For i = 1 To 7 Me.Controls("TextBox" & i).Value = "" Next i Sheets("シート1").Select ActiveWorkbook.Save Unload フォーム1 End Sub このコードを実行した時に、最初のセルには、テーブルでの行番号が挿入されますが(1から始まる)挿入される番号を、23300から始めるにはどうしたらいいでしょうか?(23300+行番号)

  • VBA 複数のシートをまたいでの連想配列

    win7、Excelは2013を使用しています。 添付画像の様に、12シートの合計を連想配列に格納しsheet13に書き出したいのですが、プロシージャーの下から6行目のところで、エラーコード451が出ます。 どの様に変更すれば良いか教えて下さい。 Sub 年間集計() Dim Dic Dim i As Integer Dim j As Integer Dim sh As Worksheet Dim rng As Range Dim buf As String Dim num As Integer Set Dic = CreateObject("Scripting.Dictionary") For Each sh In Worksheets For Each rng In sh.Range("J2", sh.Cells(Rows.Count, 10).End(xlUp)) buf = rng.Value num = rng.Offset(, 1).Value If Not Dic.Exists(buf) Then Dic.Add buf, num Else Dic.Item(buf) = Dic.Item(buf) + num End If Next rng Next sh j = 2 With Worksheets("Sheet13") For i = 0 To Dic.Count - 1 .Cells(j, 1) = Dic.Keys(i)   ’エラー箇所 .Cells(j, 2) = Dic.Items(i) j = j + 1 Next i End With End Sub

  • VBSでのコレクション

    教えてください。 VBのコレクション配列はVBSにはあるのでしょうか? クラスオブジェクトをコレクション配列に入れたいのですが.... 例: Class myclass : : End Class Sub Main() dim col as Collection dim mycl mycl = new myclass col = new myClass for i =0 to max myclass.xxx = xxxx col.add i mycl next End Sub 以上簡単ですが、myclをコレクション配列に格納したいのですが、

  • 配列のSession格納、及び取得方法について

    お世話になります。 現在Visual Studio 2005でプログラム作成中です。 質問内容は、 配列(文字列を格納)をSessionに渡し、次ページでその配列の値を取得できるかという点です。 ***(a.aspx.vb)抜粋*** Dim a() As String Redim a(DataTable1.Rows.Count) For i As Integer 0 to DataTable1.Rows.Count - 1 a(i) = CType(DataTable1.Rows(i).Item(0)) Next Session("a.list") = a(DataTable1.Rows.Count) Session("a.count") = DataTable1.Rows.Count ***(b.aspx)抜粋*** Dim b() As String = CType(Session("a.list"), String) Dim bCount as integer = CType(Session("a.count"),Integer) Dim Name as String For i As Integer 0 To bCount Name = CType(b(i),String) Next としているのですが、取得できません。 配列に格納されたものをSessionに格納し、取得することは可能なのでしょうか。 また、その他に適切なものがあればご教授ください。 よろしくお願いいたします。

  • Int((100-1+1)*Rnd+1)

    Dim i As Integer, mS(9) As String For i = 0 To 9 mS(i) = Int((100-1+1)*Rnd+1) Next i 3行目では何が行われているのでしょうか。 易しく、教えて頂けると、助かります。 宜しくお願い致します。

専門家に質問してみよう