Önceden ayarlanmış rastgele bir liste sipariş etmek en etkin yolu

4 Cevap php

Ancak ben sayfanın ortasında ve alt ödülleri genel az oy almak olduğunu bulma yaşıyorum, kullanıcıların arkadaşları için farklı ödül oy bir çevrimiçi PHP sistemi var. Ben eşit dağıtılmak üzere bu tercih ediyorum bu yüzden sayfayı yüklemek farklı, her zaman yapmak için rasgele tarafından ödül listesini sipariş ile geldi.

Ancak bu şekilde daha sonra kaydedebilir veya sayfa her hamle tekrar, ben rastgele listesini sipariş ama her kullanıcı için farklı anlam, bu kullanıcı için bu siparişi kaydedebilen bir yolu yoktur kullanıcıları karıştırmayın görünüyor.

Oyların listesi bir veritabanından geliyor ve ödüllerin isimleri önceden ayarlanmıştır.

Bunu yapmak için bir yol biliyor musunuz?

Sonunda kullandı:

  //Shuffle & Organise
    if(is_numeric($pg)) { $start = ($pg*15)-14; $end = $pg*15; $pg = (int) $pg; } else { $start = 1; $end = 15; $pg = (int) 1; }
    if($end>count($vote_name)) { $end = count($vote_name); }
    $vote_boxes = range($start,$end);
    srand($user['id']);	
    shuffle($vote_boxes);

  //Create the voting boxes + js
    foreach($vote_boxes as $row) {
    	$content .= vote_form($row);
    }

4 Cevap

En etkili yolu muhtemelen tamamen rastgele bir dizi düzen oluşturmak ve her kullanıcı için bu önbelleğe etmektir.

Yukarıdaki MySQL sollution postet hariç, çok benzer bir tarzda php kullanabilirsiniz: Siz rasgele sayı üreteci için bir başlangıç ​​olarak oturum kimliğini kullanan ve "rastgele" numarasını kullanarak diziyi karıştırabilirsiniz daha olabilir. O (en azından sürece oturumu sona değil gibi) sitenizi istediğinde bunu yaparken, her kullanıcı, bir farklı sıralı liste kucaklayacak.

<?php

  $array = array("Cat", "Dog", "Mouse");

  session_start();
  $session_id_int = (int)session_id();
  srand($session_id_int);

  echo '<pre>BEFORE:'.PHP_EOL;
  print_r($array);

  shuffle($array);

  echo 'AFTER:'.PHP_EOL;
  print_r($array);

i kullanıcıların kullanıcıların tabloda benzersiz kimlikleri var herhalde, neden değil, sadece

 select * from awards order by rand($user_id)

rand() 'tohum' anlamına gelen bir argüman kabul edebilir

(Birkaç satır daha bahsediyoruz eğer bu veritabanını eriyecek çünkü) veritabanı tablo çok büyük değilse.

<?PHP
$ip = $_SERVER['REMOTE_ADDR'];
$sql = "SELECT * FROM table ORDER BY md5(CONCAT(id,'$ip');";
$result = db_query($sql);
?>

Bu kayıt ve istemcinin IP adresi kimliği sütunu (gerçekten, herhangi bir sütun almak) karma olacaktır. Siteyi ziyaret eden her bir IP adresi farklı bir sipariş alacak, ama bu sürece kendi IP yaptığı gibi statik kalacaktır.

Gerçek karıştırma kullanacağım Fisher-Yates karıştırma algoritması yapmak. shuffle önce PRNG tohum her kullanıcı için benzersiz bir şey kullanın.