Tom Fox
Tom Fox

Reputation: 905

Using arc4random to generate ten random numbers

I am using arc4random to generate 10 random numbers so I can then query firebase to get the questions that contain the randomly generated numbers. The problem is that I don't want any number to appear more than once so then there are not duplicate questions. Current code below...

import UIKit
import Firebase

class QuestionViewController: UIViewController {

    var amountOfQuestions: UInt32 = 40

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        // Use a for loop to get 10 questions
        for _ in 1...10{
            // generate a random number between 1 and the amount of questions you have
            let randomNumber = Int(arc4random_uniform(amountOfQuestions - 1)) + 1
            print(randomNumber)
            // The reference to your questions in firebase (this is an example from firebase itself)
            let ref = Firebase(url: "https://test.firebaseio.com/questions")
            // Order the questions on their value and get the one that has the random value
            ref.queryOrderedByChild("value").queryEqualToValue(randomNumber)
                .observeEventType(.ChildAdded, withBlock: {
                    snapshot in
                    // Do something with the question
                    print(snapshot.key)
                })
        }
    }

    @IBAction func truepressed(sender: AnyObject) {
    }

    @IBAction func falsePressed(sender: AnyObject) {
    }
}

Upvotes: 0

Views: 674

Answers (5)

Harish
Harish

Reputation: 1408

You could generate random numbers and store each number in an NSArray. However, when you append it to the array you can check if the array already contains that number.

For example:

for _ in 1...10 {
let amountOfQuestions: UInt32 = 40
var intArray: [Int] = []
let randomNumber = Int(arc4random_uniform(amountOfQuestions - 1)) + 1

if intArray.contains(randomNumber) {

    repeat {
        randomNumber = Int(arc4random_uniform(amountOfQuestions - 1)) + 1
    } while intArray.contains(randomNumber)

    if !intArray.contains(randomNumber) {
        intArray.append(randomNumber)
    }


} else {
    intArray.append(randomNumber)
}

    print(intArray)
}

After that you can make a FireBase request with your uniquely generated integers. I hope I was able to help :).

Upvotes: 1

dogsgod
dogsgod

Reputation: 6387

Create unsorted Array of ten random Int 0..99

var set = Set<Int>()
while set.count < 10 {
    let num = Int(arc4random_uniform(100))
    set.insert(num)
}
let arr = Array(set)

Upvotes: 0

Luca Angeletti
Luca Angeletti

Reputation: 59496

Given the total number of questions

let questionsCount = 100

you can generate a sequence of integers

var naturals = [Int](0..<questionsCount)

Now given the quantity of unique random numbers you need

let randomsCount = 10

that of course should not exceed the total number of questions

assert(randomsCount <= questionsCount)

you can build your list of unique integers

let uniqueRandoms = (1..<randomsCount).map { _ -> Int in
    let index = Int(arc4random_uniform(UInt32(naturals.count)))
    return naturals.removeAtIndex(index)
}

Upvotes: 4

JAL
JAL

Reputation: 42449

As an alternative to generating the random number on the client and requesting a question at that specified number, you could download the entire array of questions and shuffle the array. GameKit provides a built-in method to shuffle the array.

import GameKit

// ...

let ref = Firebase(url: "https://test.firebaseio.com/questions")
// Order the questions on their value and get the one that has the random value
ref.queryOrderedByChild("value")
    .observeEventType(.ChildAdded, withBlock: {
        snapshot in
        // Shuffle your array
        let shuffledQuestions = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(snapshot)
        // Store your array somewhere and iterate through it for the duration of your game
    })

Upvotes: 2

Terence
Terence

Reputation: 443

You can have an array to store the value you want to random with, in your case, [1,2,3....10], and then use arc4random to get the random index of any value inside (0..9), get the value and remove it from array. Then you will never get the same number from the array.

Upvotes: 5

Related Questions