ランダム ツリー トラバーサルを引き起こすfind
(または)の述語はどうですか? lower_bound
ツリーの高さを推定し、時には葉ノードの前で終了できるように、セットのサイズを伝える必要があります。
編集:これに関する問題std::lower_bound
は、述語を使用しますが、ツリーのような動作を持たないことに気付きました(内部的にはstd::advance
、別の回答のコメントで説明されているものを使用しています)。 std::set<>::lower_bound
セットの述語を使用します。これはランダムにすることはできず、セットのような動作をします。
あはは、別の述語を使用することはできませんが、変更可能な述語を使用することはできます。std::set
述語オブジェクトを値で渡すため、述語として a を使用してpredicate &
、到達して変更できるようにする必要があります (「ランダム化」モードに設定します)。
これは準実用的な例です。残念ながら、正しいランダムな述語に頭を悩ませることはできないため、ランダム性は優れていませんが、誰かがそれを理解できると確信しています:
#include <iostream>
#include <set>
#include <stdlib.h>
#include <time.h>
using namespace std;
template <typename T>
struct RandomPredicate {
RandomPredicate() : size(0), randomize(false) { }
bool operator () (const T& a, const T& b) {
if (!randomize)
return a < b;
int r = rand();
if (size == 0)
return false;
else if (r % size == 0) {
size = 0;
return false;
} else {
size /= 2;
return r & 1;
}
}
size_t size;
bool randomize;
};
int main()
{
srand(time(0));
RandomPredicate<int> pred;
set<int, RandomPredicate<int> & > s(pred);
for (int i = 0; i < 100; ++i)
s.insert(i);
pred.randomize = true;
for (int i = 0; i < 100; ++i) {
pred.size = s.size();
set<int, RandomPredicate<int> >::iterator it = s.lower_bound(0);
cout << *it << endl;
}
}
私の中途半端なランダム性テストは./demo | sort -u | wc -l
、一意の整数がいくつ得られるかを確認することです。より大きなサンプル セットを使用./demo | sort | uniq -c | sort -n
して、不要なパターンを探してみてください。