Android: Восстановление использования фокуса SurfaceView

Есть два способа, с помощью которых вы можете выбрать случайные уникальные числа из последовательности , не проверяя по ранее выбранным номерам (т. Е. Уже в вашем BST).

Использовать random_shuffle

Простой способ - перетасовать отсортированный массив из 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), потому что сложность случайного перетасовки амортизируется по большему набору результатов.

Использоватьiform_int_distribution

Если размер случайных чисел для выбора намного меньше, чем размер общих чисел, то можно использовать альтернативный способ:

#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;
}
5
задан mcccclean 23 March 2009 в 05:37
поделиться

1 ответ

Ошибочный диагноз! Приложение воссоздает поверхность автоматически, но существует вызов там, который пытается потянуть к нему, прежде чем это будет создано.

Решение проблемы:

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 не стесняются комментировать, является ли это плохой практикой!)

1
ответ дан 15 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: