从android kotlin中的数组进行采样

从android kotlin中的数组进行采样,android,kotlin,sample,Android,Kotlin,Sample,我需要一个做这件事的主意。我数学不好。 也许它有我还没有找到的内置功能 我有一个由2048个数据组成的数组。 我需要从中获得250的价值 我在想 2048/250 = 8.19 也就是说,我在数组中每增加8个位置就取一个值 有一个函数可以做到这一点吗?我不知道,我认为问题在于平衡迭代和采样的随机性 因此,天真的做法 dataSet.indexedMapNotNull { i, data -> if (i % 8 == 0) data else null } 这将贯穿整个数组,因

我需要一个做这件事的主意。我数学不好。 也许它有我还没有找到的内置功能

我有一个由2048个数据组成的数组。 我需要从中获得250的价值

我在想

2048/250 = 8.19
也就是说,我在数组中每增加8个位置就取一个值


有一个函数可以做到这一点吗?

我不知道,我认为问题在于平衡迭代和采样的随机性

因此,天真的做法

dataSet.indexedMapNotNull { i, data ->
    if (i % 8 == 0) data else null
}
这将贯穿整个数组,因此您只需要250次迭代,而不需要
dataSet.size
iterations。那么,如果我们迭代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)
}

子数组没有以伪随机的方式对数据进行采样,但只得到了前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)

}
val sample=mutableSetOf()
while(sample.size!=250){
val randomPosition=Random.nextInt(0,dataSet.size)
val randomSelection=数据集[randomPosition]
sample.add(随机选择)
}

这里我们使用一个集合,因为一个
集合
保证了元素的唯一性,所以您的数据集中有完全随机的250个元素。问题是位置的随机性会使相同的
randomPosition
重复多次,因此在数据集上重复250次以上,这甚至可能是在更大的数据集中会发生的阶乘,被认为是性能最低的。

您想要采样,为什么不找一个统计库或类似的东西呢?如果是一次性的,那可能是一种过度的杀伤力。如果你使用一些固定元素,为什么不使用前250个呢?@al3c因为这不是采样,而是偏差。我添加了另一种方法it@cutiko选择一组预先固定的指数与你选择的指数一样有偏差。通常人们会选择随机指数。谢谢。我会试试你的建议。首先需要得到你说的:)你需要从数据集中获得250个值,这些值必须通过所有数据集获得,而不仅仅是从0到250,所以我们定义了一种随机方法,在这种情况下,如果每个8,因为2048除以250。因此,我们不需要每次迭代数据集,如果一个位置可以被8整除,我们只需要迭代250次,这是我们需要的。我更喜欢第二个选项,它不会随机化。以8为增量。谢谢
val sample = mutableSetOf<DataType>()

while (sample.size != 250) {
    val randomPosition = Random.nextInt(0, dataSet.size)
    val randomSelection = dataSet[randomPosition]
    sample.add(randomeSelection)

}