Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 使用kotlin streams从列表中获取随机项_Random_Kotlin - Fatal编程技术网

Random 使用kotlin streams从列表中获取随机项

Random 使用kotlin streams从列表中获取随机项,random,kotlin,Random,Kotlin,如何以简单简洁的方式从列表中获取随机项。 如果我想从这个列表中得到一个偶数随机数 val list = listOf(1, 2, 3, 4, 5, 6, 7, 9).filter { it % 2 == 0 } 注: 我知道java中有一些类似的答案可以解决这个问题,但我认为我们可以在kotlin中找到一种更简洁的方法。我认为最简单、最简洁的方法是创建一个返回随机元素的扩展函数,以便可以这样使用: val random = list.random() 扩展功能: /** * Returns

如何以简单简洁的方式从列表中获取随机项。
如果我想从这个列表中得到一个偶数随机数

val list = listOf(1, 2, 3, 4, 5, 6, 7, 9).filter { it % 2 == 0 }
注:

我知道java中有一些类似的答案可以解决这个问题,但我认为我们可以在kotlin中找到一种更简洁的方法。

我认为最简单、最简洁的方法是创建一个返回随机元素的扩展函数,以便可以这样使用:

val random = list.random()
扩展功能:

/**
 * Returns a random element.
 */
fun <E> List<E>.random(): E? = if (size > 0) get(Random().nextInt(size)) else null
/**
*返回一个随机元素。
*/
乐趣列表。随机():E?=if(size>0)get(Random().nextInt(size))else null
感谢@Francesco comment,这里有另一个函数,它将随机实例作为随机性的来源

/**
 * Returns a random element using the specified [random] instance as the source of randomness.
 */
fun <E> List<E>.random(random: java.util.Random): E? = if (size > 0) get(random.nextInt(size)) else null
/**
*使用指定的[random]实例作为随机性源返回随机元素。
*/
乐趣列表.random(random:java.util.random):E?=if(size>0)get(random.nextInt(size))else null
Kotlin 1.3及以上版本: Kotlin 1.3现在可用于多平台随机数生成器 您可以这样使用它:

import kotlin.random.Random

fun main() {
    println(Random.nextBoolean())
    println(Random.nextInt())
}

还是你的情况

fun main() {
    val list = (1..9).filter { it % 2 == 0 }
    println(list.random())
}


科特林1.2 自从Kotlin 1.2以来,我们已经。此方法可以帮助您使用提取所需元素的数量(本例中仅一个)

与1.2版之前的方法相比,该方法的优化程度较低,但它适用于多平台上下文。根据你的上下文使用你需要的


在Kotlin 1.2之前 在Kotlin 1.2之前,在多平台上下文中不存在生成随机数的解决方案。最简单的解决方案是直接调用平台Random

虚拟机 在JVM上,我们使用
Random
甚至
ThreadLocalRandom
,如果我们使用的是JDK>1.6

import java.util.Random

fun IntRange.random() = Random().nextInt((endInclusive + 1) - start) + start
JS 在JS上,我们使用
Math.Random

fun IntRange.random() = (Math.random() * ((endInclusive + 1) - start) + start).toInt()

仅仅为了得到一个随机数而洗牌整个列表是对性能的浪费

改为使用Kotin 1.3中介绍的

val randomNumber = listOf(1, 6, 8).random()

对于您的特殊用例,首先筛选列表并从剩余项中选择一个随机数是有意义的

val randomEvenNumber = listOf(1, 2, 3, 4, 5, 6, 7, 9).filter { it % 2 == 0 }.random()

如果要从列表中选择25个随机元素,我会这样做:

var suliTraffic = ArrayList<SuliTraffic>()
var randomsuliTraffic = ArrayList<SuliTraffic>()

// I have add some data to my Array List
randomsuliTraffic.add(new)

// Here i shuffle all the information i have wich is over 400 object
randomsuliTraffic.shuffle()

// now you can just simply get 25 item from this randomsuliTraffic like this
for (i in randomsuliTraffic.take(25)){
    suliTraffic.add(i)
} 
var suliTraffic=ArrayList()
var randomsuliTraffic=ArrayList()
//我已经在数组列表中添加了一些数据
randomsuliTraffic.add(新)
//在这里,我洗牌的所有信息,我有超过400个对象
randomsuliTraffic.shuffle()
//现在你只需从这个随机的Sulitraffic中得到25件物品,就像这样
对于(我在随机的sulitraffic.take(25)){
补充(i)
} 

现在,您可以在
suliTraffic
列表中找到25个随机元素。

正如其他人所说,
list.random()
现在应该可以解决这个问题,但是如果您不知道列表是否为空,
.random()
可能会引发异常。除了将
.randomOrNull()
实现为扩展函数之外,您还可以使用
list.shuffled().firstOrNull()
对其进行破解,但要注意,这对于长列表来说很慢

.randomOrNull()
方法:

fun <E> List<E>.randomOrNull(): E? = if (size > 0) random() else null
fun List.randomOrNull():E?=如果(大小>0)随机()否则为空

每次都要小心使用新初始化的
随机
实例。通常随机性需要几次调用才能调整到可接受的阈值。有趣的是,我可以想到这种方法的一种变体,它采用预先指定的随机性。我会加上它。感谢您的注意。
Random()
的当前实现是:
public Random(){this(seeduniquifer()^System.nanoTime());}
@FrancescoMenzani,您对新初始化的实例有什么担心?我更关心的是每次调用时的对象创建。另外,我建议将一个存储实例设置为私有,这样它只能在声明它的文件中访问。我使用了这种方法,但我需要对整个列表进行洗牌,这在外部效率很低。当您只想得到一个随机元素时,shuffled的实现会遍历所有列表项。Kotlin js或Kotlin native上不提供如何更灵活地处理多平台context.java.util.Random。如果您不想重新实现自己的随机数生成器,那么这是唯一可能的方法。如果您需要从列表中随机选取3个值,则shuffled().take()可以,而不是您的方法(但这不是您的用例)。为什么不选择“list.shuffled()[0]”,因为使用take可以提取1个或多个值。如果您只需要一个值,那么您的解决方案是相同的。
fun <E> List<E>.randomOrNull(): E? = if (size > 0) random() else null