生成一定数量的数字的随机数

Mer*_*ury 5 random range swift

HY,

我有一个非常基本的问题是:

如何在Swift中创建一个20位数的随机数,没有浮动没有负数(基本上是一个Int)?

感谢所有答案XD

Luc*_*tti 12

步骤1

首先,我们需要一个扩展Int来生成一个范围内的随机数.

extension Int {
    init(_ range: Range<Int> ) {
        let delta = range.startIndex < 0 ? abs(range.startIndex) : 0
        let min = UInt32(range.startIndex + delta)
        let max = UInt32(range.endIndex   + delta)
        self.init(Int(min + arc4random_uniform(max - min)) - delta)
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以这样使用:

Int(0...9) // 4 or 1 or 1...
Int(10...99) // 90 or 33 or 11
Int(100...999) // 200 or 333 or 893
Run Code Online (Sandbox Code Playgroud)

第2步

现在我们需要一个接收所请求位数的函数,计算随机数的范围,最后调用新的初始值Int.

func random(digits:Int) -> Int {
    let min = Int(pow(Double(10), Double(digits-1))) - 1
    let max = Int(pow(Double(10), Double(digits))) - 1
    return Int(min...max)
}
Run Code Online (Sandbox Code Playgroud)

测试

random(1) // 8
random(2) // 12
random(3) // 829
random(4) // 2374
Run Code Online (Sandbox Code Playgroud)

  • 在Swift 4中,获取错误"无法使用类型'(CountableClosedRange <Int>)''的参数列表调用类型'Int'的初始值设定项" (3认同)

ZAF*_*007 9

Swift 5:简单的解决方案

func random(digits:Int) -> String {
    var number = String()
    for _ in 1...digits {
       number += "\(Int.random(in: 1...9))"
    }
    return number
}

print(random(digits: 1)) //3
print(random(digits: 2)) //59
print(random(digits: 3)) //926
Run Code Online (Sandbox Code Playgroud)

注意它会返回值String,如果你需要Int值,那么你可以这样做

let number = Int(random(digits: 1)) ?? 0
Run Code Online (Sandbox Code Playgroud)


Uno*_*ome 4

这是一些伪代码,应该可以完成您想要的操作。

generateRandomNumber(20)
func generateRandomNumber(int numDigits){
   var place = 1
   var finalNumber = 0;
   for(int i = 0; i < numDigits; i++){
      place *= 10
      var randomNumber = arc4random_uniform(10)
      finalNumber += randomNumber * place
  }
  return finalNumber
}
Run Code Online (Sandbox Code Playgroud)

它非常简单。您生成 20 个随机数,并将它们分别乘以它们应该所在的十位、百位、千位……。这样,您将保证数字的大小正确,但会随机生成将在每个地方使用的数字。

更新

正如评论中所说,您很可能会遇到这么长的数字溢出异常,因此您必须在如何存储数字(字符串等)方面发挥创意,但我只是想向您展示一种生成具有保证数字长度的数字的简单方法。另外,考虑到当前的代码,您的前导数字有可能为 0,因此您也应该防止这种情况发生。

  • 在哪里将其解析回数字?变成 uint128_t? (2认同)
  • 好点@zaph。我不知道为什么他需要一个 20 位数字的号码。但也许这个问题更适合生成一个具有一定位数的数字,而 20 是一个不寻常的随机数。标题问的是如何生成数字,帖子里就是神秘数字20出现的地方。 (2认同)