java - 如何在Kotlin中获取随机数?

可以在2个参数之间返回随机整数的通用方法,如ruby,可以使用rand(0..n)。

有什么建议吗?

16个解决方案

208 votes

我的建议是IntRange上的扩展函数来创建这样的randoms:Char

Kotlin> = 1.3,对Random的多平台支持

从1.3开始,Kotlin自带多平台随机发生器。 这个KEEP描述了它。 您现在可以执行以下操作(源):

Random.nextInt(0, 10)

因此,扩展功能在所有平台上都如下所示:

fun IntRange.random() = Random.nextInt(start, endInclusive + 1)

Kotlin<1.3

在1.3之前,在JVM上我们使用Char甚至10如果我们使用的是JDK>1.6。

fun IntRange.random() =

Random().nextInt((endInclusive + 1) - start) + start

像这样使用:

// will return an `Int` between 0 and 10 (incl.)

(0..10).random()

如果您希望该函数仅返回Char(不包括10),请使用由Char构造的范围:

(0 until 10).random()

如果你正在使用JDK> 1.6,使用Char而不是Char。

KotlinJs和其他变种

对于kotlinjs和其他不允许使用Char的用例,请参阅此替代方案。

此外,请参阅此答案以了解我的建议的变化。 它还包括随机Chars的扩展功能。

s1m0nw1 answered 2019-06-15T08:51:50Z

37 votes

生成from(含)和to之间的随机整数(不包括)

import java.util.Random

val random = Random()

fun rand(from: Int, to: Int) : Int {

return random.nextInt(to - from) + from

}

Magnus answered 2019-06-15T08:52:18Z

23 votes

从kotlin 1.2开始,你可以写:

(1..3).shuffled().last()

请注意它是大O(n),但对于一个小列表(尤其是唯一值),它没关系:D

mutexkid answered 2019-06-15T08:52:58Z

10 votes

你可以创建一个类似于Random的扩展功能,但是它的绑定需要Random而不是Random:

fun Random.nextInt(range: IntRange): Int {

return range.start + nextInt(range.last - range.start)

}

您现在可以在任何Random实例中使用它:

val random = Random()

println(random.nextInt(5..9)) // prints 5, 6, 7, or 8

如果您不想管理自己的Random实例,则可以使用例如Random定义便捷方法:

fun rand(range: IntRange): Int {

return ThreadLocalRandom.current().nextInt(range)

}

现在,您可以像在Ruby中一样获得随机整数,而无需先自己声明Random实例:

rand(5..9) // returns 5, 6, 7, or 8

mfulton26 answered 2019-06-15T08:53:48Z

8 votes

可能的变化我的随机字符的其他答案

为了得到随机的java.util.Randoms,您可以定义这样的扩展函数

fun ClosedRange.random(): Char =

(Random().nextInt(endInclusive.toInt() + 1 - start.toInt()) + start.toInt()).toChar()

// will return a `Char` between A and Z (incl.)

('A'..'Z').random()

如果你正在使用JDK> 1.6,使用java.util.Random而不是java.util.Random。

对于kotlinjs和其他不允许使用java.util.Random的用例,这个答案会有所帮助。

Kotlin> = 1.3多平台支持Random

从1.3开始,Kotlin自带多平台随机发生器。 这个KEEP描述了它。 您现在可以执行以下操作(源):

fun ClosedRange.random(): Char = Random.nextInt(start.toInt(), endInclusive.toInt() + 1).toChar()

s1m0nw1 answered 2019-06-15T08:54:46Z

6 votes

建立@ s1m0nw1优秀答案我做了以下更改。

(0..n)意味着在Kotlin中包容

(0到n)意味着在Kotlin独家

对Random实例使用单例对象(可选)

码:

private object RandomRangeSingleton : Random()

fun ClosedRange.random() = RandomRangeSingleton.nextInt((endInclusive + 1) - start) + start

测试用例:

fun testRandom() {

Assert.assertTrue(

(0..1000).all {

(0..5).contains((0..5).random())

}

)

Assert.assertTrue(

(0..1000).all {

(0..4).contains((0 until 5).random())

}

)

Assert.assertFalse(

(0..1000).all {

(0..4).contains((0..5).random())

}

)

}

Steven Spungin answered 2019-06-15T08:55:47Z

5 votes

在[1,10]范围内随机的例子

val random1 = (0..10).shuffled().last()

或利用Java Random

val random2 = Random().nextInt(10) + 1

Andrey answered 2019-06-15T08:56:21Z

4 votes

如果您使用的是Kotlin JavaScript且无法访问java.util.Random,则以下内容将起作用:

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

像这样使用:

// will return an `Int` between 0 and 10 (incl.)

(0..10).random()

Kotlin> = 1.3多平台支持Random

从1.3开始,Kotlin自带多平台随机发生器。 这个KEEP描述了它。 您现在可以执行以下操作(源):

Random.nextInt(0, 10)

因此,扩展功能可以在所有平台上简化为以下内容:

fun IntRange.random() = Random.nextInt(start, endInclusive + 1)

s1m0nw1 answered 2019-06-15T08:57:04Z

3 votes

实现s1m0nw1的答案的另一种方法是通过变量访问它。 并不是说它更有效,但它可以让你免于输入()。

var ClosedRange.random: Int

get() { return Random().nextInt((endInclusive + 1) - start) + start }

private set(value) {}

现在它可以这样访问

(1..10).random

Quinn answered 2019-06-15T08:57:39Z

2 votes

使用顶级函数,您可以实现与Ruby中完全相同的调用语法(如您所愿):

fun rand(s: Int, e: Int) = Random().nextInt(e + 1 - s) + s

用法:

rand(1, 3) // returns either 1, 2 or 3

Willi Mentzel answered 2019-06-15T08:58:09Z

1 votes

首先,你需要一个RNG。 在Kotlin中,您目前需要使用平台特定的(没有内置的Kotlin)。 对于JVM,它是java.util.Random。您需要创建它的实例,然后调用random.nextInt(n)。

Mibac answered 2019-06-15T08:58:37Z

1 votes

没有标准方法可以执行此操作,但您可以使用Math.random()或类java.util.Random轻松创建自己的方法。以下是使用Math.random()方法的示例:

fun random(n: Int) = (Math.random() * n).toInt()

fun random(from: Int, to: Int) = (Math.random() * (to - from) + from).toInt()

fun random(pair: Pair) = random(pair.first, pair.second)

fun main(args: Array) {

val n = 10

val rand1 = random(n)

val rand2 = random(5, n)

val rand3 = random(5 to n)

println(List(10) { random(n) })

println(List(10) { random(5 to n) })

}

这是一个示例输出:

[9, 8, 1, 7, 5, 6, 9, 8, 1, 9]

[5, 8, 9, 7, 6, 6, 8, 6, 7, 9]

Mahdi AlKhalaf answered 2019-06-15T08:59:12Z

1 votes

如果您要选择的数字不是连续的,您可以在List上定义自己的扩展功能:

fun List.randomElement()

= if (this.isEmpty()) null else this[Random().nextInt(this.size)]

用法:

val list = listOf(3, 1, 4, 5)

val number = list.randomElement()

返回列表中的一个数字。

Willi Mentzel answered 2019-06-15T08:59:50Z

1 votes

Kotlin标准库不提供随机数生成器API。 如果您不在多平台项目中,最好使用平台api(问题的所有其他答案都谈论此解决方案)。

但是如果你处于多平台环境中,最好的解决方案是在纯kotlin中自己实现随机,以便在平台之间共享相同的随机数生成器。 开发和测试更简单。

为了在我的个人项目中回答这个问题,我实现了一个纯Kotlin线性同余生成器。 LCG是java.util.Random使用的算法。如果您想使用它,请点击此链接:[https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4]

我的实现目的nextInt(range: IntRange)为你;)。

关注我的目的,LCG适用于大多数用例(模拟,游戏等......),但由于此方法的可预测性,因此不适合加密使用。

Valentin Michalak answered 2019-06-15T09:00:51Z

0 votes

在Kotlin 1.3中你可以这样做

val number = Random.nextInt(limit)

deviant answered 2019-06-15T09:01:20Z

-1 votes

超级骗子))

fun rnd_int(min: Int, max: Int): Int {

var max = max

max -= min

return (Math.random() * ++max).toInt() + min

}

Deomin Dmitriy answered 2019-06-15T09:01:49Z

java如何实取随机数_java - 如何在Kotlin中获取随机数?相关推荐

  1. java canvas 画圆_java – 如何在Android中通过canvas绘制圆?

    我想画画圆.这里是我的代码: [MyActivity.java]: public class MyActivity extends Activity { public void onCreate(Bu ...

  2. java awt 关闭窗口_java – 如何在awt中关闭窗口?

    我在awt中创建一个小的应用程序,当我关闭窗口时,关闭按钮不起作用,但是我已经添加了关闭按钮的功能,之后关闭按钮不起作用- import java.awt.*; import java.applet. ...

  3. java 控件换行_Java – 如何在swing中添加换行符

    我正在为我的迷你游戏添加一个按钮,但我不知道如何换行.我想在按钮和文本之间有一个空格,这里是代码: JPanel panel1 = new JPanel(); JLabel label1 = new ...

  4. java hibernate 自定义排序_java – 如何在hibernate中对关联表进行排序?

    根据JPA规范: The property or field name must correspond to that of a persistent property or field of the ...

  5. java执行python路径_如何在Python中获取当前执行文件的路径?

    您无法直接确定正在执行的主脚本的位置 . 毕竟,有时脚本根本不是来自文件 . 例如,它可以来自交互式解释器或仅存储在存储器中的动态生成的代码 . 但是,您可以可靠地确定模块的位置,因为模块始终从文件加 ...

  6. kotlin半生对象_如何在Kotlin中使用Actor实现对象池

    kotlin半生对象 by osha1 由osha1 如何在Kotlin中使用Actor实现对象池 (How to implement an Object-Pool with an Actor in ...

  7. java+script+当前日期_如何在JavaScript中获取当前日期?

    如何在JavaScript中获取当前日期? #1楼 您可以使用扩展了 Date对象的Date.js库,从而可以使用.today()方法. #2楼 如果您想对日期格式进行更多的粒度控制,我强烈建议您查看 ...

  8. 如何在Activity中获取调用者 -- getReferrer()

    如何在Activity中获取调用者 – getReferrer() 前言 为什么要在Activity中获取调用者? 主要是安全和定制两个方面的需求吧. 安全需求: 一般Activity如果已经对外开放 ...

  9. 如何在PHP中获取客户端IP地址[重复]

    本文翻译自:How to get the client IP address in PHP [duplicate] This question already has an answer here: ...

最新文章

  1. 同样都是调参,为什么人家的神经网络比我牛逼 100 倍?
  2. MySQL · 引擎特性 · InnoDB 崩溃恢复过程
  3. pygame用精灵编组的问题的猜想和验证(未完待续)
  4. JDK源码解析之 java.lang.Class
  5. java if和else if的区别_关于C语言中if,elseif和else的区别在哪里
  6. pulse 去马赛克软件_细致到毛孔头发 神还原的高清大图!AI去马赛克新算法
  7. 迭代器java.util.Iterator接口
  8. 80端口被占用的两种解决方案 - 超详细(已解决)
  9. java barchart_Bar Chart
  10. 数学建模-线性规划模型基本原理与编程实现
  11. 数智融合加速驱动企业商业创新
  12. JavaScript高级程序设计读书笔记(第6章面向对象的程序设计之创建对象)
  13. linux acl权限是什么意思,Linux ACL是什么意思
  14. 如何用python做比分网_python爬虫足球比分-yltg888
  15. 6.S081参考书笔记 —— 第7章调度、进程交互
  16. 新房和二手房税费比较
  17. 手机免流开热点教程(ROOT版)
  18. 曹政--互联网搜索老师傅
  19. 关于计算机在教室的文化建设方案,教室文化的建设方案
  20. 图像的论轮廓提取算法与代码

热门文章

  1. 带用户名和密码的GitHub链接
  2. chrome里面的一些小技巧
  3. js执行环境作用域和闭包_JavaScript中执行上下文,提升,作用域和闭包的终极指南
  4. 开发人员kpi怎么写_为什么开发人员应该知道怎么写
  5. 代码抽象_如何通过抽象使代码更具可读性
  6. 如何遍历JavaScript中的对象
  7. ruby 查看csv文件_如何使用CSV和Ruby构建终端游戏
  8. 蝙蝠侠一键改udid软件_对于您的第一个HTML代码,让我们帮助蝙蝠侠写一封情书...
  9. 2020计算机科学第五轮评估,2019-2020全国计算机专业大学排名
  10. Python网络爬虫开发实战,关于过程中的异常处理