2016-02-22 3 views
0

Я использую arc4random, чтобы сгенерировать 10 случайных чисел, поэтому я могу запросить firebase для получения вопросов, содержащих произвольно сгенерированные числа. Проблема в том, что я не хочу, чтобы какое-то число появлялось более одного раза, поэтому не возникает повторяющихся вопросов. Текущий код ниже ...Использование arc4random для генерации десяти случайных чисел

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) { 
    } 
} 
+2

Вы не должны вычитать 1 из amountOfQuestions –

+2

Вы можете случайно удалить каждый элемент из исходного массива, если вы не хотите, чтобы они происходят дважды –

ответ

4

Учитывая общее количество вопросов

let questionsCount = 100 

вы можете создать последовательность целых чисел

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

Теперь, учитывая количество уникальных случайных чисел, вам нужно

let randomsCount = 10 

tha т, конечно, не должно превышать общее количество вопросов

assert(randomsCount <= questionsCount) 

вы можете создать свой список уникальных целых чисел

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

Поскольку вы не удаляете случайные объекты, которые вы выбираете из массива, нельзя ли повторить одно и то же значение? Кажется, что строка 'return naturals [index]' должна быть изменена на 'return naturals.removeAtIndex (index)'. Это приведет к удалению и возврату объекта. –

+0

@appzYourLife как Duncan C уже отметил, что это не помешает случайному числу появляться более одного раза. Просто измените количество вопросов на 10, и вы заметите это. –

+0

Вы правы! Позвольте мне исправить это, как только я приду домой. И благодарю вас! –

5

Вы можете иметь массив для хранения значения, которое вы хотите случаен, в вашем случае, [1,2,3 .... 10], а затем использовать arc4random для получить случайный индекс любого значения внутри (0..9), получить значение и удалить его из массива. Тогда вы никогда не получите одинаковый номер из массива.

2

В качестве альтернативы генерации случайного числа на клиенте и запроса вопроса на указанном номере вы можете загрузить весь массив вопросов и перетасовать массив. GameKit предоставляет встроенный метод для перетасовки массива.

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 
    }) 
1

Вы могли бы генерировать случайные числа и хранить каждое число в NSArray. Однако, когда вы добавляете его в массив, вы можете проверить, содержит ли массив этот номер.

Например:

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) 
} 

После того, что вы можете сделать запрос FireBase с вашим уникальным сгенерированных чисел. Надеюсь, я смог помочь :).

0

Создать несортированный массив из десяти случайных Int 0..99

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