随机字母数字字符串 Linux Swift 3
Random Alphanumeric String Linux Swift 3
我在尝试使用 Swift 3.
在 Linux 中生成 运行dom 字符串时遇到 2 个问题
arc4random_uniform 仅在 BSD 上 Linux 中不可用。所以我能够使用 运行dom() 函数。这在我生成 运行 可变大小的 dom 数字时有效(参见下面的代码)
func generateRandomNumber() -> Int
{
var place = 1
var finalNumber = 0;
#if os(Linux)
for _ in 0..<5
{
place *= 10
let randomNumber = Int(random() % 10) + 1
finalNumber += randomNumber * place
}
#else
for _ in 0..<5
{
place *= 10
let randomNumber = Int(arc4random_uniform(10))
finalNumber += randomNumber * place
}
#endif
return finalNumber
}
那行得通。
编辑: 它有效,但每次都给我相同的数字:(
- 尝试生成 运行dom 字母数字字符串时,我只能使用 Swift 字符串而不是 NSSTRING。 Linux 抛出此错误
原始 Linux 代码块:
func randomString(_ length: Int) -> String
{
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = UInt32(letters.length)
var randomString = ""
for _ in 0 ..< length {
let rand = arc4random_uniform(len)
var nextChar = letters.character(at: Int(rand))
randomString += NSString(characters: &nextChar, length: 1) as String
}
return randomString
}
以及我在使用上述代码时遇到的实际错误
error: cannot convert value of type 'NSString' to type 'String' in coercion
randomString += NSString(characters: &nextChar, length: 1) as String
修改了 linux 代码块。
func randomString(_ length: Int) -> String
{
let letters : String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = letters.characters.count
var randomString = ""
#if os(Linux)
for _ in 0..<length
{
let randomValue = (random() % len) + 1
randomString += "\(letters[letters.index(letters.startIndex, offsetBy: Int(randomValue))])"
}
#else
for _ in 0 ..< length
{
let rand = arc4random_uniform(UInt32(len))
randomString += "\(letters[letters.index(letters.startIndex, offsetBy: Int(rand))])"
}
#endif
return randomString
}
但这次错误很奇怪,它只说 非法指令,没有任何额外信息。我 运行 docker 容器处于交互模式,我看到我的服务器 运行 并在调用其他函数等时打印出来
但问题是当我 运行 它在 IBM swift 中时该功能确实有效
沙箱
我假设它也使用 linux。我非常困惑和困惑任何帮助将不胜感激。
(UPDATE): 我 运行 在一个 linux env 中有相同的功能,只有一个 swift 文件而不是 Vapor swift 网络框架。它有效。正如我在上面的编辑中提到的,它每次都会给我相同的 运行dom 字符串。构建完成后,我仍然需要测试整个项目。但除此之外,我还需要知道 运行dom() 函数是否真的每次都会给我一些新东西,而不是同样的废话。
1) 总是相同的数字
您必须设置一次种子才能从 random()
中获取 "random" 个数字:
randomSeed(Int(Date().timeIntervalSince1970)
If no seed value is provided, the random() function is
automatically seeded with a value of 1.
因为种子总是相同的 (1),所以您总是得到相同的 "random" 个数字序列。
2) 字母数字字符串
要在不使用 NSString
的情况下创建字符串:
func randomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = UInt32(letters.characters.count)
var randomString = ""
for _ in 0 ..< length {
let rand = myCustomRandom(len)
let randIndex = letters.index(letters.startIndex, offsetBy: Int(rand))
let nextChar = letters[randIndex]
randomString += String(nextChar)
}
return randomString
}
想通了。
所以重复随机 number/string 的答案是在我调用 random() 函数之前添加这一行
srand(UInt32(time(nil)))
我假设这也是修复非法指令的原因。因为我不记得改变任何其他东西。
这里不用多说就是我的最终结果
func generateRandomNumber() -> Int
{
var place = 1
var finalNumber = 0;
#if os(Linux)
srand(UInt32(time(nil)))
for _ in 0..<5
{
place *= 10
let randomNumber = Int(random() % 10) + 1
finalNumber += randomNumber * place
}
#else
for _ in 0..<5
{
place *= 10
let randomNumber = Int(arc4random_uniform(10))
finalNumber += randomNumber * place
}
#endif
return finalNumber
}
func randomString(_ length: Int) -> String
{
let letters : String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = letters.characters.count
var randomString = ""
#if os(Linux)
srand(UInt32(time(nil)))
for _ in 0..<length
{
let randomValue = (random() % len) + 1
randomString += "\(letters[letters.index(letters.startIndex, offsetBy: Int(randomValue))])"
}
#else
for _ in 0 ..< length
{
let rand = arc4random_uniform(UInt32(len))
randomString += "\(letters[letters.index(letters.startIndex, offsetBy: Int(rand))])"
}
#endif
return randomString
}
我完全复制并粘贴了您的代码,但无法编译。
fatal error: Can't form a Character from an empty String
这是另一种方法:
// Keep at top of your code (outside of functions)
#if os(Linux)
srandom(UInt32(time(nil)))
#endif
func getRandomNumber(_ min: Int, _ max: Int) -> Int {
#if os(Linux)
return Int(random() % max) + min
#else
return Int(arc4random_uniform(UInt32(max)) + UInt32(min))
#endif
}
func getRandomString(_ chars: String, _ length: Int) -> String {
var str = ""
for _ in 1...length {
str.append(chars.itemOnStartIndex(advancedBy: getRandomNumber(0, chars.count - 1)))
}
return str
}
// Best practice to define this outside of the function itself
let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
print(getRandomString(chars, 10))
这适用于我 Ubuntu。
Swift 4.2, Ubuntu 16.04
let letters : String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = letters.count
var randomString:String = ""
for _ in 0 ..< length {
let rand = Int.random(in: 0..<len)
randomString += letters.map { String([=10=]) }[rand]
}
我在尝试使用 Swift 3.
在 Linux 中生成 运行dom 字符串时遇到 2 个问题arc4random_uniform 仅在 BSD 上 Linux 中不可用。所以我能够使用 运行dom() 函数。这在我生成 运行 可变大小的 dom 数字时有效(参见下面的代码)
func generateRandomNumber() -> Int { var place = 1 var finalNumber = 0; #if os(Linux) for _ in 0..<5 { place *= 10 let randomNumber = Int(random() % 10) + 1 finalNumber += randomNumber * place } #else for _ in 0..<5 { place *= 10 let randomNumber = Int(arc4random_uniform(10)) finalNumber += randomNumber * place } #endif return finalNumber }
那行得通。 编辑: 它有效,但每次都给我相同的数字:(
- 尝试生成 运行dom 字母数字字符串时,我只能使用 Swift 字符串而不是 NSSTRING。 Linux 抛出此错误
原始 Linux 代码块:
func randomString(_ length: Int) -> String
{
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = UInt32(letters.length)
var randomString = ""
for _ in 0 ..< length {
let rand = arc4random_uniform(len)
var nextChar = letters.character(at: Int(rand))
randomString += NSString(characters: &nextChar, length: 1) as String
}
return randomString
}
以及我在使用上述代码时遇到的实际错误
error: cannot convert value of type 'NSString' to type 'String' in coercion
randomString += NSString(characters: &nextChar, length: 1) as String
修改了 linux 代码块。
func randomString(_ length: Int) -> String
{
let letters : String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = letters.characters.count
var randomString = ""
#if os(Linux)
for _ in 0..<length
{
let randomValue = (random() % len) + 1
randomString += "\(letters[letters.index(letters.startIndex, offsetBy: Int(randomValue))])"
}
#else
for _ in 0 ..< length
{
let rand = arc4random_uniform(UInt32(len))
randomString += "\(letters[letters.index(letters.startIndex, offsetBy: Int(rand))])"
}
#endif
return randomString
}
但这次错误很奇怪,它只说 非法指令,没有任何额外信息。我 运行 docker 容器处于交互模式,我看到我的服务器 运行 并在调用其他函数等时打印出来
但问题是当我 运行 它在 IBM swift 中时该功能确实有效 沙箱
(UPDATE): 我 运行 在一个 linux env 中有相同的功能,只有一个 swift 文件而不是 Vapor swift 网络框架。它有效。正如我在上面的编辑中提到的,它每次都会给我相同的 运行dom 字符串。构建完成后,我仍然需要测试整个项目。但除此之外,我还需要知道 运行dom() 函数是否真的每次都会给我一些新东西,而不是同样的废话。
1) 总是相同的数字
您必须设置一次种子才能从 random()
中获取 "random" 个数字:
randomSeed(Int(Date().timeIntervalSince1970)
If no seed value is provided, the random() function is automatically seeded with a value of 1.
因为种子总是相同的 (1),所以您总是得到相同的 "random" 个数字序列。
2) 字母数字字符串
要在不使用 NSString
的情况下创建字符串:
func randomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = UInt32(letters.characters.count)
var randomString = ""
for _ in 0 ..< length {
let rand = myCustomRandom(len)
let randIndex = letters.index(letters.startIndex, offsetBy: Int(rand))
let nextChar = letters[randIndex]
randomString += String(nextChar)
}
return randomString
}
想通了。
所以重复随机 number/string 的答案是在我调用 random() 函数之前添加这一行
srand(UInt32(time(nil)))
我假设这也是修复非法指令的原因。因为我不记得改变任何其他东西。
这里不用多说就是我的最终结果
func generateRandomNumber() -> Int
{
var place = 1
var finalNumber = 0;
#if os(Linux)
srand(UInt32(time(nil)))
for _ in 0..<5
{
place *= 10
let randomNumber = Int(random() % 10) + 1
finalNumber += randomNumber * place
}
#else
for _ in 0..<5
{
place *= 10
let randomNumber = Int(arc4random_uniform(10))
finalNumber += randomNumber * place
}
#endif
return finalNumber
}
func randomString(_ length: Int) -> String
{
let letters : String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = letters.characters.count
var randomString = ""
#if os(Linux)
srand(UInt32(time(nil)))
for _ in 0..<length
{
let randomValue = (random() % len) + 1
randomString += "\(letters[letters.index(letters.startIndex, offsetBy: Int(randomValue))])"
}
#else
for _ in 0 ..< length
{
let rand = arc4random_uniform(UInt32(len))
randomString += "\(letters[letters.index(letters.startIndex, offsetBy: Int(rand))])"
}
#endif
return randomString
}
我完全复制并粘贴了您的代码,但无法编译。
fatal error: Can't form a Character from an empty String
这是另一种方法:
// Keep at top of your code (outside of functions)
#if os(Linux)
srandom(UInt32(time(nil)))
#endif
func getRandomNumber(_ min: Int, _ max: Int) -> Int {
#if os(Linux)
return Int(random() % max) + min
#else
return Int(arc4random_uniform(UInt32(max)) + UInt32(min))
#endif
}
func getRandomString(_ chars: String, _ length: Int) -> String {
var str = ""
for _ in 1...length {
str.append(chars.itemOnStartIndex(advancedBy: getRandomNumber(0, chars.count - 1)))
}
return str
}
// Best practice to define this outside of the function itself
let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
print(getRandomString(chars, 10))
这适用于我 Ubuntu。
Swift 4.2, Ubuntu 16.04
let letters : String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = letters.count
var randomString:String = ""
for _ in 0 ..< length {
let rand = Int.random(in: 0..<len)
randomString += letters.map { String([=10=]) }[rand]
}