PHP nasıl benzersiz rastgele sayılar üretebilirsiniz?

7 Cevap php

Ben bir MCQ modül üzerinde çalışıyorum ve benim veritabanından rastgele soru almak gerekir. Sorun kopyalarını elde etmek gibi görünüyor olmasıdır.

7 Cevap

Eğer veritabanından onları alma yapıyorsanız, işini yapmak için SQL kullanın. örneğin (yinelenen olmadan) 20 rastgele soru getiriliyor:

SELECT * FROM questions ORDER BY RAND() LIMIT 20

Onlara erişimi rastgele, soruları değil karıştırmak istiyor gibi geliyor. Yani algoritma bu gibi bir şey olurdu.

  1. Görüntülemek istediğiniz tüm soru (veya soru anahtarları) alın.
  2. Onları shuffle
  3. Karıştırılan sırayla onları / görüntü almak

üreticimizin için check out: Fisher-Yates shuffle algorithm

Eğer MySQL kullanıyorsanız ve veri makul küçük bir miktar varsa, RAND ORDER BY kullanabilirsiniz ()

Bkz http://stackoverflow.com/questions/203382/do-stateless-random-number-generators-exist

Pseudo-random sayıların herhangi bir dizisi sonunda tekrar edecektir. Eğer sözde rasgele sayılar elde edilir nasıl?

Daha fazla bilgi olmadan i ilkel bir çözüm önerebilir. (Ama daha fazla bilgi ile sorunuzu güncelleyin)

O zaman (geçici olabilir ya da olmayabilir) bir tabloya kaydetmek çünkü ben, sen kullanıcımız var tahmin ediyorum, ne sorular kullanıcı zaten kazanılmış söyledi.

Kullanıcıların yoksa, o kullanıcı için bir kullanıcı kimliği olarak SESSION_ID kullanabilirsiniz.

Eğer ilk kez bir soru getir ve kullanıcı yanıtlar Yani, bir tabloya kaydetmek için gereken bilgi ve sonra kullanıcının kimliğini ve soruyu en id kaydeder.

Bir sonraki soru getiriliyor zaman, kullanıcı bu yeni tabloda o soru id olup olmadığını görmek için bir kontrol yapın.

Eğer satır, çok sayıda varsa, 0 ve 1 ve daha sonra bir sorgu ile almak arasında bir sayı depolayan tabloya bir sütun ekleyebilirsiniz:

SELECT * FROM `mytable` WHERE `randcolumn` > RAND() LIMIT 20

Bu veritabanı rastgele sadece 20 satır sağlamak için tüm tabloyu sipariş etmek anlamına gelir.

Hangi yöntemleri denediniz? Herhangi RNG teorisi olmayan yinelenen sayılar garanti eğer ben bilmiyorum, ama her zaman sonuç bir tablo depolamak ve bu dayalı herhangi tekrarları atmak olabilir.