2009-08-13 8 views
0

タイトルによれば、DataTableからx DataRowsをランダムに選択する最も効率的な方法は何でしょうか?DataTableから無作為に選択する最良の方法は?

私は必要なだけ多くなるまで、次のようなことを繰り返すことはできますか?

protected DataRow SelectRandomRow(DataTable dataTable, Random randomSelector) 
{ 
    return dataTable.Rows[randomSelector.Next(dataTable.Rows.Count)]; 
} 

もっと良い方法がありますか。

答えて

1

あなたのソリューションは完全に合理的な選択肢のようです。

しかし、同じ行を複数回返す可能性があるため、重複する行が返されるかどうかを確認する必要があります。

1

私が取り組んでいたランダムドラッグテストシステムでは、実際には修飾レコードのクエリに戻り、結果セットの列としてrandom()列を追加し、その列で並べ替えました。

選択randomFunction()RandSequenceとして、ランダムなので1

によってテーブルの順序からotherfieldsは、元のシードに基づいており、それは確率に基づいて、正確に同じ時間、同じ秒で実行するつもりはありませんそして人間の仲間入り、それは素晴らしい仕事をしました。私は同じ人の "プール"に対して50,000回のクエリを実行しました。そのようなグループのうちの1つは800人以上でした。結果を保存しました。ある時点で、人はまったく同じ位置に4回だけしか存在しませんでしたが、10進精度の差に完全に基づいていました。

次に、トップのXレコードを常に結果セットから直接取り出すことができます。

2

Dim DT1 As New DataTable 
    DT1.Columns.Add("SN1") 
    DT1.Columns.Add("NAME1") 
    DT1.Rows.Add("1", "Test1") 
    DT1.Rows.Add("2", "Test2") 
    DT1.Rows.Add("3", "Test3") 
    DT1.Rows.Add("4", "Test4") 
    DT1.Rows.Add("5", "Test5") 
    DT1.Rows.Add("6", "Test6") 
    DT1.Rows.Add("7", "Test7") 
    DT1.Rows.Add("8", "Test8") 
    DT1.Rows.Add("9", "Test9") 
    DT1.Rows.Add("10", "Test10") 
    DataGridView1.DataSource = DT1 

    Dim DT2 As New DataTable 
    DT2.Columns.Add("SN1") 
    DT2.Columns.Add("NAME1") 
    Dim I, CNT, J As Integer 
    Dim RS As New Random 

    While DT1.Rows.Count > 0 
     CNT = DT1.Rows.Count - 1 
     Try 
      J = RS.Next(CNT) 
      DT2.Rows.Add(DT1.Rows(J)("SN1"), DT1.Rows(RS.Next(CNT))("NAME1")) 
     Catch ex As Exception 
     End Try 
     DT1.Rows.RemoveAt(J) 
    End While 
    DataGridView2.DataSource = DT2 
End Sub 
...........私の解決策は完璧であるホープ
関連する問題