#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <vector>
float unifRand()
{
return (static_cast<float>(rand() / double(RAND_MAX)));
//return (((214013 * seed_ + 2531011) >> 16) & 0x7FFF);
}
int randomSample(std::vector<int>&indices_, unsigned int& N, const unsigned int& sample_size, std::vector<int>&indices) {
//unsigned N = static_cast<unsigned> (30); //max
//unsigned int sample_size = 20;
//std::vector<int>indices;
//std::vector<int>indices_(N);
for (size_t i = 0; i < N; i++)
{
indices_[i] = i;
}
// If sample size is 0 or if the sample size is greater then input cloud size
// then return all indices
if (sample_size >= N)
{
printf("sample_size >= N ......");//
}
else
{
// Resize output indices to sample size
indices.resize(static_cast<size_t> (sample_size));
// Set random seed so derived indices are the same each time the filter runs
std::srand(static_cast<unsigned int>(time(NULL)));
// Algorithm A
unsigned top = N - sample_size;
unsigned i = 0;
unsigned index = 0;
for (size_t n = sample_size; n >= 2; n--)
{
float V = unifRand();
unsigned S = 0;
float quot = static_cast<float> (top) / static_cast<float> (N);
while (quot > V)
{
S++;
top--;
N--;
quot = quot * static_cast<float> (top) / static_cast<float> (N);
}
index += S;
indices[i++] = indices_[index++];
N--;
}
}
return 0;
}
int main(int argc, char** argv)
{
/*****************方法一****************/
//方法一 会产生重复数字
/*
int n = 30;
double U;
int random_num;
srand(static_cast<unsigned int>(time(NULL))); //初始化随机数种子
for (int i = 0; i < 20; i++)
{
U = (double)rand() / RAND_MAX; //生成[0,1]之间的随机数
random_num = (int)((n - 1)*U + 0.5); //生成[0,n-1]之间的随机数
printf("%d ", random_num);
}*/
/*****************方法二****************/
unsigned int N = static_cast<unsigned int> (30); //max
unsigned int sample_size = 20;
std::vector<int>indices;
std::vector<int>indices_(N);
randomSample(indices_, N, sample_size, indices);
return 0;
}
inline int randomGeneration(const int& max_num, const int gen_num, std::vector<int>& random_num_vec) {
for (int i = 0; i < abs(gen_num); i++)
{
double U = (double)rand() / RAND_MAX; //生成[0,1]之间的随机数
int random_num = (int)((max_num - 1)*U + 0.5); //生成[0,max_num-1]之间的随机数
random_num_vec.push_back(random_num);
}
return 0;
};