Я видел много ответов, предлагающих использовать
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
. Это работает, но заставляет Сканер мультимедиа повторно сканировать мультимедиа на устройстве. Более эффективный подход будет заключаться в запросе / удалении через провайдера контента Media Store:
// Set up the projection (we only need the ID)
String[] projection = { MediaStore.Images.Media._ID };
// Match on the file path
String selection = MediaStore.Images.Media.DATA + " = ?";
String[] selectionArgs = new String[] { file.getAbsolutePath() };
// Query for the ID of the media matching the file path
Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver contentResolver = getContentResolver();
Cursor c = contentResolver.query(queryUri, projection, selection, selectionArgs, null);
if (c.moveToFirst()) {
// We found the ID. Deleting the item via the content provider will also remove the file
long id = c.getLong(c.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
Uri deleteUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
contentResolver.delete(deleteUri, null, null);
} else {
// File not found in media store DB
}
c.close();
Так и должно быть, это вероятность, не стоит ожидать критического попадания 1 балл каждые 5 битв .. попробуйте с монеткой или кубиком и убедитесь сами. Но это только я. ГБ
Как многие говорят, это действительно проблема с тем, что «случайное». Результаты, которые вы получаете, случайны, и независимо от того, как вы делаете игру, некоторые игроки будут считать, что ваш счетчик нечестный и не случайный. ;)
Один из возможных вариантов - гарантировать попадание каждые n раз и генерировать n случайным образом в определенных границах после каждого попадания. Все дело в том, что «чувствуется» правильным при тестировании.
Для генераторов случайных чисел C ++ используйте rand или boost :: random
Каждый раз, когда игрок получает удар, вы просто проверяете, есть ли случайное число в [0; 1] меньше 0,2. Это означает, что кто-то не может получить критических попаданий в 15, но это маловероятно.
Это даст вам естественные случайные числа в соответствии с законами биномиального распределения (p = 0,2)
static int crit = 0;
public bool isCritical()
{
crit = crit++ % 5;
return (crit==0);
}
if you still want some randomness, alter the modulus using another static variable each time a crit is performed. varying it will equal probability from 3 to 7 should keep the average time between crits at 1 in 5, but never less than 3 or more than 7 hits between them.
Проблема с бозо-сортировкой в том, что она может длиться вечно.
Я тоже пытался решить эту проблему. Лучшее, что я мог придумать, - это динамическое изменение вероятностей чисел на основе того, как часто они появлялись в ближайшем прошлом. Что-то вроде (для кубика в Matlab):
probabilities = [1 1 1 1 1 1];
unrandomness = 1;
while true
cumprob = cumsum(probabilities) ./ sum(probabilities);
roll = find(cumprob >= rand, 1)
probabilities = probabilities + unrandomness;
probabilities(roll) = probabilities(roll) - 6*unrandomness;
if min(probabilities) < 0
probabilities = probabilities - min(probabilities);
end
end
Извините за отсутствие отступов. Параметр неслучайности можно настроить по желанию. Истинный случайный вывод (неслучайность = 0):
2 3 1 1 4 1 3 3 4 5 1 5 5 2 6 1 1 1 6 1 1 3 5 6 6 1 4 2 4 6 3 6 5 1 1 6 2 5 6 4 3 5 2 4 6 5 5 5 4 4 3 4 1 2
неслучайность = 1:
3 2 4 5 6 2 6 2 4 1 5 5 1 6 4 3 1 4 2 1 3 2 6 5 3 6 5 3 1 4 1 6 5 3 4 2 1 6 5 4 1 4 3 1 6 6 5 4 3 1 5 2 3 2
Думаю, выглядит лучше. Особенно, если вы нанесете промежутки между числами.
Я думаю, вам нужно сгенерировать случайные числа из распределения Пуассона.