#android #kotlin #sample
#Android #kotlin #образец
Вопрос:
Мне нужна идея, как это сделать. Я не силен в математике. Возможно, у него есть встроенная функция, которую я еще не нашел.
У меня есть массив, который состоит из 2048 данных. Мне нужно получить из этого значение 250.
Я думаю о
2048/250 = 8.19
это означает, что я принимаю значение при каждом приращении 8 позиции в массиве.
Есть ли функция для этого?
Комментарии:
1. Вам нужна выборка, так почему бы не поискать статистическую библиотеку или что-то в этом роде? Может быть, если это 1 раз, это перебор
2. Если вы берете несколько фиксированных элементов, почему бы не взять первые 250?
3. @al3c поскольку это не будет выборка, она будет предвзятой
4. Я добавляю другой способ сделать это
5. @cutiko выбор предварительно фиксированного набора индексов одинаково смещен, независимо от того, какие индексы вы выбираете. Обычно выбираются случайные индексы.
Ответ №1:
Насколько мне известно, я не думаю, что проблема заключается в том, чтобы сбалансировать итерации и случайность выборки.
Итак, наивный подход
dataSet.indexedMapNotNull { i, data ->
if (i % 8 == 0) data else null
}
Это будет проходить через весь массив, поэтому вам нужно всего 250 итераций, а не dataSet.size
итераций. Так что, если мы повторим 250 раз, и для каждого из них мы берем 8-й раз
val sample = mutableListOf<DataType>()
for (i in 1..250) {
val positionInDataSet = (i * 8) - 1 //minus one adjust the index for the size
val case = dataSet[positionInDataSet]
sample.add(case)
}
Другой альтернативой было бы просто использовать методы копирования из коллекций, но проблема в том, что вы теряете выборку
dataSet.subArray(0, 250)
Подмассив не произвел выборку данных псевдослучайным способом, а получил только первые 250, и это было бы предвзято. Преимущество обычно заключается в том, что методы копирования массива представляют собой журнал N.
Другим вариантом было бы еще больше рандомизировать вещи, получая данные не каждые 8, а случайную позицию, пока мы не достигнем желаемого размера выборки.
val sample = mutableSetOf<DataType>()
while (sample.size != 250) {
val randomPosition = Random.nextInt(0, dataSet.size)
val randomSelection = dataSet[randomPosition]
sample.add(randomeSelection)
}
Здесь мы используем набор, потому Set
что гарантируем уникальные элементы, поэтому у вас есть совершенно случайные 250 элементов из вашего набора данных. Проблема в том, что случайность в позиции может повторяться randomPosition
более одного раза, поэтому вы выполняете итерацию по набору данных более 250 раз, это может быть даже факториальным, что в больших наборах данных может произойти и считается самой низкой производительностью.
Комментарии:
1. Спасибо. Я попробую ваше предложение. Сначала нужно понять, что ты говоришь 🙂
2. Вам нужно получить 250 значений из набора данных, эти значения должны быть получены из всего набора данных, а не только от 0 до 250, поэтому мы определяем случайный способ сделать это, в данном случае, если каждый 8, потому что это 2048 делится на 250. Итак, вместо того, чтобы каждый раз повторять набор данных и получать эти данные, если это позиция, кратная 8, мы выполняем итерацию только 250 раз, что нам нужно.
3. я предпочитаю второй вариант, который не рандомизирует его. просто сделайте приращение 8. большое спасибо