Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/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 生成差异始终为正的随机数_Random_Kotlin - Fatal编程技术网

Random 生成差异始终为正的随机数

Random 生成差异始终为正的随机数,random,kotlin,Random,Kotlin,我试图生成一些数字,这样的差异总是正的。用户输入所需的位数和行数。例如,3行将产生3位数字 971 888 121 我想确保它们之间的区别总是积极的。有什么算法我可以用吗。现在,我只是让我的程序创建数字,然后减去它们,如果结果是负数,它会再做一次。。。一次又一次。它非常慢 我在考虑首先生成差异,然后将其相加,直到达到所需行的数量。但是如果我生成了一个非常大的数字,我就会遇到问题 这是我用来生成一个X位随机数的代码,以防万一 private fun createRandomNumber(digi

我试图生成一些数字,这样的差异总是正的。用户输入所需的位数和行数。例如,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)的建议,我首先对一个包含所有生成数字的数组进行排序,这样可以将所有数据加速到可接受的程度

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

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) }
}
fun main(args:Array){
打印(“多少个数字:”)
val numbers=readLine()!!.toInt()
打印(“多少位数:”)
val digits=readLine()!!.toInt()
val set=mutableSetOf()
做{
set.add(createRandomNumber(数字))
}while(set.size<数字)
val array=set.toTypedArray().SortedDarray()
array.forEach{println(it)}
}
获取用户的输入并创建一组随机数

使用
toTypedArray().SortedDarray Descending()
可以获得数组

即使@forpas解决方案很好,由于最终排序,它仍然在
O(n log n)
中运行。我的解决方案只是生成生成随机数的递增间隔(用于均匀分布),然后
将每个间隔映射到该范围内的随机数,从而避免了对最终列表进行排序的需要。复杂性是
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)
}

你能生成任意的数字,然后对它们进行排序吗?@JeffBowman,事实上这是可行的!我甚至没想到。你会报告这应该是什么语言吗?@matt,这是android的kotlin(base don Java)版本。谢谢。作为一个标签,你应该这么做。我喜欢你的
11298
16284
20841
26084
31960
35538
37208
45325
46970
52918
57514
59769
67689
70135
75338
78075
84561
86652
91938
99931