2017-05-06 8 views
-3

繰り返しを使わずにランダムな文字列を生成する機能が必要です。 ABCC即時に繰り返さずにランダムな文字列を生成

func randomString(length:Int) -> String { 
let charSet = "ABCDEF" 
var c = charSet.characters.map { String($0) } 
var s:String = "" 
for _ in (1...length) { 
    s.append(c[Int(arc4random()) % c.count]) 
} 
return s 
} print(randomString(length: 4)) 

を、私は、唯一例えばランダムな一意の文字列を印刷したい: たとえば、この機能が多分に印刷されますABCD使用する方法

+0

は、これまでのカードゲームをプレイ? "シャッフル"という言葉を聞いたことがありますか?キャラクターをシャッフルし、最初の4つを取り除く。 – matt

+1

http://stackoverflow.com/questions/27761557/shuffling-a-string-in-swift(そのうちの質問は実際に重複しています) – matt

+0

またはこの記事:http://stackoverflow.com/questions/26845307/文字列の中で文字列を生成する – iWheelBuy

答えて

0
func randomString(length: Int) -> String { 
    let charSet = "ABCDEF" 
    var charSetArray = charSet.characters.map { String($0) } 
    var randArray: [String] = [] 
    while charSetArray.count > 0 { 
     let i = Int(arc4random_uniform(UInt32(charSetArray.count))) 
     randArray.append(charSetArray[i]) 
     charSetArray.remove(at: i) 
    } 
    var output: String = "" 
    for i in 0..<length { 
     output.append(randArray[i]) 
    } 
    return output 
} 
1
import GameplayKit 

func randomString(length : Int) -> String { 
    let charSet = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters) 
    let shuffled = GKRandomSource.sharedRandom().arrayByShufflingObjects(in: charSet) as! [Character] 
    let array = shuffled.prefix(length) 
    return String(array) 
} 

print(randomString(length: 4)) 
+0

あなたの答えで重複する文字は可能です – iWheelBuy

+0

どのようにですか?一連の文字がシャッフルされます。いずれも重複しません。最初の「長さ」の項目は、シャッフルされた配列の前面から取得されます。セット内の文字はどこで複製できますか? –

+0

配列( "ABCA" .characters) – iWheelBuy

0

let randomString = "ABCDEF".random(length: 3)! 

長さが指定された文字列の長さを超える可能性があるため、戻り値はオプションです。

は完全な実装をチェックアウト:

import UIKit 
import PlaygroundSupport 

extension MutableCollection where Indices.Iterator.Element == Index { 
    mutating func shuffle() { 
     let c = count 
     guard c > 1 else { return } 
     for (firstUnshuffled , unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) { 
      let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount))) 
      guard d != 0 else { continue } 
      let i = index(firstUnshuffled, offsetBy: d) 
      swap(&self[firstUnshuffled], &self[i]) 
     } 
    } 
} 

extension Sequence { 
    func shuffled() -> [Iterator.Element] { 
     var result = Array(self) 
     result.shuffle() 
     return result 
    } 
} 

extension String { 

    func random(length: Int) -> String? { 
     let uniqueCharacters = Array(Set(characters.map({ String($0) }))) 
     guard length <= uniqueCharacters.count else { return nil } 
     guard length > 0 else { return nil } 
     return uniqueCharacters[0..<length].shuffled().joined() 
    } 
} 
関連する問題