产生差值始终为正的随机数

时间:2018-12-22 21:51:04

标签: random kotlin

我正在尝试生成一些数字,以使差异始终为正。用户输入数字和所需的行数。例如3位3行将产生

971
888
121

我想确保两者之间的差异始终是积极的。有什么我可以使用的算法。现在我只是让我的程序创建数字,然后减去它们,如果结果是负数,它将再次执行...非常慢。

我正在考虑先产生差异,然后将其相加直到达到所需的行数。但是如果我生成大量数字,就会遇到问题。

这是我用来生成具有X位数字的随机数的代码,以防万一。

private fun createRandomNumber(digits: Int): Int {
        val numberArray = IntArray(digits)
        for (number in 0 until numberArray.size){
            numberArray[number] = 9
        }
        val maxnumber:Int = numberArray.joinToString("").toInt()
        numberArray[0] = 1
        for (number in 1 until numberArray.size){
            numberArray[number] = 0
        }
        val minnumber:Int = numberArray.joinToString("").toInt()
        return (minnumber..maxnumber).random()
    }

根据杰夫·鲍曼(Jeff Bowman)的建议,我首先对包含所有生成数字的数组进行排序,然后将所有内容加速到可接受的数量!

2 个答案:

答案 0 :(得分:2)

即使@forpas解决方案很好,由于最终排序,它仍然可以在O(n log n)中运行。我的解决方案只是生成递增的间隔,在其中生成随机数(用于均匀性分布),然后将每个间隔map设为该范围内的随机数,从而避免了对最终列表进行排序的需要。复杂度为O(n)

我选择使用Stream以避免突变或显式递归,但这不是强制性的。

示例

fun main(args: Array<String>) {
    val count = 20L
    val digits = 5

    val min =  pow(10.0, digits.toDouble() - 1).toLong()
    val max = min*10 - 1
    val gap = (max - min)/count + 1

    val numbers =
        Stream.iterate(Pair(min, min + gap)) { (_, prev) -> Pair(prev, prev + gap) }
            .map { (start, end) -> Random.nextLong(start, end) }
            .limit(count)
            .collect(Collectors.toList()) 

    numbers.forEach(::println)
}

输出

11298
16284
20841
26084
31960
35538
37208
45325
46970
52918
57514
59769
67689
70135
75338
78075
84561
86652
91938
99931

答案 1 :(得分:1)

我将使用此函数来创建一个具有一定位数的随机数:

fun createRandomNumber(digits: Int) = (10f.pow(digits - 1).toInt() until 10f.pow(digits).toInt()).shuffled().first()

您将需要此导入:

import kotlin.math.pow

然后加上这个:

fun main(args: Array<String>) {
    print("how many numbers?: ")
    val numbers = readLine()!!.toInt()
    print("how many digits?: ")
    val digits = readLine()!!.toInt()

    val set = mutableSetOf<Int>()

    do {
        set.add(createRandomNumber(digits))
    } while (set.size < numbers)

    val array = set.toTypedArray().sortedArrayDescending()
    array.forEach { println(it) }
}

您将获得用户的输入并创建一组随机数。
使用toTypedArray().sortedArrayDescending(),您可以获得数组。