2

セットから指定された数のランダム要素を選択する関数を作成する必要があるプロジェクトに取り組んでいます。次に、これらの要素を変数にマップして、後で比較します。

したがって、私のシナリオでは、特定のセットの 5% を選択する必要があります。

let rec randomSet (a:Set<string>) =
let setLength = (a.Count / 100) * 5

let list = []
let rand = System.Random
if set.Length <> setLength then
    // some code will go here
    randomSet setLength eIDS
else
    set

^私のコードを批判してください。F# でコーディングを始めてまだ 1 週間です。

再帰的にやろうとしましたが、間違った方法だと感じています。私は他の方法を試しましたが、それらは .take 関数を使用しているため、返されるコレクションは毎回同じです。

何か案は?私はセットから 1 つの要素を求めているのではなく、それに投げられたセットの 5% を求めています。

これはこれと同じ質問ではありません: How can I select a random value from a list using F#

と思われる方、解説お願いします。

4

2 に答える 2

5

これには複数の方法があります。入力内の要素の数と選択するアイテムの数に応じて、別の戦略がより効率的になる場合があります。

おそらく最も簡単な方法は、入力を乱数で並べ替えてtakeから、必要な数の要素を取得するために使用することです。

let data = [| 0 .. 1000 |]

let rnd = System.Random()

data 
|> Seq.sortBy (fun _ -> rnd.Next())
|> Seq.take 50

これにより、シーケンスがランダムにソートされます (大きなシーケンスの場合は遅くなる可能性があります) が、必要な数の要素が正確に必要になります (項目の約 5% を返す Mark のソリューションとは異なります)。

大きなリストから小さな数を選択したい場合は、インデックスをランダムに生成し (重複がないことを確認して)、インデックスに基づいて直接検索を行う方がよい場合があります。

于 2016-08-31T15:41:02.947 に答える