Есть два способа, с помощью которых вы можете выбрать случайные уникальные числа из последовательности , не проверяя по ранее выбранным номерам (т. Е. Уже в вашем BST).
Простой способ - перетасовать отсортированный массив из 1 ... 20 000 и просто выбрать первые 10000 элементов:
#include <algorithm>
#include <vector>
std::vector<int> values(20000);
for (int i = 0; i < 20000; ++i) {
values[i] = i+1;
}
std::random_shuffle(values.begin(), values.end());
for (int i = 0; i < 10000; ++i) {
// Insert values[i] into your BST
}
Этот метод хорошо работает, если размер случайных чисел (10000) для выбора сравнимо с размером общих чисел (20000), потому что сложность случайного перетасовки амортизируется по большему набору результатов.
Если размер случайных чисел для выбора намного меньше, чем размер общих чисел, то можно использовать альтернативный способ:
#include <chrono>
#include <random>
#include <vector>
// Use timed seed so every run produces different random picks.
std::default_random_engine reng(
std::chrono::steady_clock::now().time_since_epoch().count());
int num_pick = 1000; // # of random numbers remained to pick
int num_total = 20000; // Total # of numbers to pick from
int cur_value = 1; // Current prospective number to be picked
while (num_pick > 0) {
// Probability to pick `cur_value` is num_pick / (num_total-cur_value+1)
std::uniform_int_distribution<int> distrib(0, num_total-cur_value);
if (distrib(reng) < num_pick) {
bst.insert(cur_value); // insert `cur_value` to your BST
--num_pick;
}
++cur_value;
}
Ошибочный диагноз! Приложение воссоздает поверхность автоматически, но существует вызов там, который пытается потянуть к нему, прежде чем это будет создано.
Решение проблемы:
boolean mSurfaceExists;
...
public void surfaceDestroyed(SurfaceHolder holder) {
mSurfaceExists = false;
...
}
public void surfaceCreated(SurfaceHolder holder) {
mSurfaceExists = true;
...
}
protected void onWindowVisibilityChanged(int visibility) {
// only call base if there's a surface
if(mSurfaceExists)
super.onWindowVisibilityChanged(visibility);
}
Теперь это - вся выпуклость. (насколько я знаю, так или иначе - эксперты Java/Android не стесняются комментировать, является ли это плохой практикой!)