/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2012 The MITRE Corporation * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * * You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "common.h" using namespace std; /**** GLOBAL ****/ void Common::seedRNG() { static bool seeded = false; if (!seeded) { srand(0); // We seed with 0 instead of time(NULL) to have reproducible randomness seeded = true; } } QList Common::RandSample(int n, int max, int min, bool unique) { seedRNG(); QList samples; samples.reserve(n); int range = max-min; if (range <= 0) qFatal("Non-positive range."); if (unique && (n >= range)) { for (int i=min; i Common::RandSample(int n, const QSet &values, bool unique) { seedRNG(); QList valueList = values.toList(); if (unique && (values.size() <= n)) return valueList; QList samples; samples.reserve(n); while (samples.size() < n) { const int randIndex = rand() % valueList.size(); samples.append(valueList[randIndex]); if (unique) valueList.removeAt(randIndex); } return samples; }