ich eine elegante Art und Weise zu denken, ich versuche, von einem Satz in F # eine zufällige Teilmenge des ErhaltensHolen Sie sich einen zufällig ausgewählten Untergruppe von einem Satz in F #
Irgendwelche Gedanken dazu?
Vielleicht würde das funktionieren: sagen wir haben einen Satz von 2 x Elemente und wir müssen eine Teilmenge von y-Elemente auswählen. Wenn wir dann eine x-große Bit-Zufallszahl erzeugen könnten, die genau y 2 n enthält, haben wir effektiv eine zufällige Maske mit y-Löchern darin. Wir könnten weiterhin neue Zufallszahlen generieren, bis wir die erste haben, die diese Einschränkung erfüllt, aber gibt es einen besseren Weg?
Da dieser Ansatz schlecht abschneidet, sollten Sie besser in ein Array konvertieren, mischen und dann die ersten m Ergebnisse als Set verwenden - es ist wahrscheinlich einfacher zu booten. Und wenn Sie _really_ nicht möchten, Ihre ursprüngliche Menge in ein Array zu konvertieren, könnten Sie immer noch eine zufällige boolesche Maske mit einem entsprechend gemischten Array (mit m True und nm false) generieren, und dann einfach das Array mit setzen, Filtere die Masken und mappe zurück in die Menge - ohne jemals die ursprüngliche Menge in ein Array zu konvertieren und trotzdem die O (n) -Leistung beizubehalten. –
Ihr Code-Snippet enthält normalerweise denselben Satz von Elementen außer dem letzten. Ich bin 4 Mal gelaufen: '[0; 1; 5], [0; 1; 6], [0; 1; 2], [0; 1; 4] '. Offensichtlich ** es ist nicht zufällig ** Teilmenge. Und es passiert wegen dieser Linie 'Ausbeute! Set |> Set.remove i' –
'yield!' liefert alle Elemente einer Sequenz, in diesem Fall die ursprüngliche Menge mit einem Element entfernt ('set |> Set.remove i'), was falsch ist. Die Funktion sollte rekursiv sein ('lass rec randomSubSet n set = ...') und du solltest "nachgeben"! set |> Set.entfernung i |> randomSubSet (n-1) '. –