-3

I want the function to generate random String without repeating. For example this function maybe will print: 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))

and i want print random unique string only, E.g : ABCD

Sami
  • 41
  • 2
  • 4

3 Answers3

2
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))
Scott Thompson
  • 22,629
  • 4
  • 32
  • 34
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
}
Eggsalad
  • 383
  • 2
  • 9
0

How to use:

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

The return value is optional because the length might exceed the length of provided string.

Check out the full implementation:

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()
    }
}
iWheelBuy
  • 5,470
  • 2
  • 37
  • 71