これを行うには複数の方法があります。最初の方法は次のとおりです。
1. use input parameter k to dynamically allocate an array of numbers
unsigned * numsArray = (unsigned *)malloc(sizeof(unsigned) * k);
2. run a loop that gets k random numbers and stores them into the numsArray (must be careful here to check each new random to see if we have gotten it before, and if we have, get another random, etc...)
3. sort numsArray
4. run a loop beginning at the beginning of DataSet with your own incrementing counter dataCount and another counter numsCount both beginning at 0. whenever dataCount is equal to numsArray[numsCount], grab the current data object and add it to your newly created random list then increment numsCount.
5. The loop in step 4 can end when either numsCount > k or when dataCount reaches the end of the dataset.
6. The only other step that may need to be added here is before any of this to use the next command of the object type to count how large the dataset is to be able to bound your random numbers and check to make sure k is less than or equal to that.
これを行う 2 番目の方法は、実際のリストを複数回実行することです。
// one must assume that once we get to the end, we can start over within the set again
1. run a while loop that checks for endOfData
a. count up a count variable that is initialized to 0
2. run a loop from 0 through k-1
a. generate a random number that you constrain to the list size
b. run a loop that moves through the dataset until it hits the rand element
c. compare that element with all other elements in your new list to make sure it isnt already in your new list
d. store the element into your new list
現在のリストの場所を保存することで2番目の方法を高速化する方法があるかもしれません.取得したい要素。
これを行うための潜在的な 3 番目の方法は次のとおりです。
1. run a loop from 0 through k-1
a. generate a random
b. use the generated random as a skip count, move skip count objects through the list
c. store the current item from the list into your new list
この 3 番目の方法の問題は、リストの大きさがわからないため、ランダム スキップ カウントを制限する方法がわからないことです。さらに、そうしたとしても、リストの最後の要素に簡単に到達できるランダムに取得されたサブセットのようには見えない可能性があります。選択されているのと同じショット。)
おそらく、これを行う最も速い方法は方法 1 です。最初にランダムな数値を生成し、次にリストを 1 回だけトラバースします (はい、実際には 2 回、データセット リストのサイズを取得するために 1 回、次にランダムな要素を取得するために 1 回)。