Выборка n случ. неповторяющихся чисел из x кол-ва?

Сергей123

Новичок
.des., признаю: действительно, в моём коде - ошибка

Royal Flash,
>> Так код, приведенный выше можно использовать?
Мой - (пока) точно нет. Найду время - исправлю и положу правильный (уже для себя просто...).
 

azamat

Guest
PHP:
$mas = array(1,..,200);
for ($i=n;$i>=0;$i--) 
{ 
  $k = rand(0,$i); 
  $buf = $mas[$i]; 
  $mas[$i] = $mas[$k]; 
  $mas[$k] = $buf; 
}
 

rotoZOOM

ACM maniac
таким образом ты перемешаешь только n первых элементов, немного подправляем :))
PHP:
for ($i=0;$i<n;$i++) 
{ 
  $k = rand($i+1,200); 
  $buf = $mas[$i]; 
  $mas[$i] = $mas[$k]; 
  $mas[$k] = $buf; 
}
-~{}~ 07.04.05 13:45:

но тогда уж лучше применить shuffle
PHP:
srand((float)microtime() * 1000000);
array_splice(shuffle(range(1, 200)),20);
 

Сергей123

Новичок
Так, значит сверху - "реализация в лоб", ниже - модификация во избежание предварительной инициализации.
PHP:
define('N', 4);
define('K', 3);

# инициализируем массив (значение элемента == индексу элемента)
for ( $i = 1; $i <= N; $i++ ) {
    $arr[$i] = $i;
} # for

# находим наши K чисел
for ( $i = 1; $i <= K; $i++ ) {
    $rand = mt_rand($i, N);
    # меняем местами элементы с индексами $i и $rand
    list ($arr[$i], $arr[$rand]) = array ($arr[$rand], $arr[$i]);
    # элемент с индексом $i - наш
    echo ' ' . $arr[$i];
} # for
-------------------------------
PHP:
define('N', 4);
define('K', 3);

# находим наши K чисел
for ( $i = 1; $i <= K; $i++ ) {
    $rand = mt_rand($i, N);
    # меняем местами элементы с индексами $i и $rand,
    # при необходимости инициализируя их
    if ( ! isset ($arr[$rand]) ) {
        $arr[$rand] = $rand;
    } # if
    if ( ! isset ($arr[$i]) ) {
        $arr[$i] = $i;
    } # if
    list ($arr[$i], $arr[$rand]) = array ($arr[$rand], $arr[$i]);
    # элемент с индексом $i - наш
    echo ' ' . $arr[$i];
} # for
 

.des.

Поставил пиво кому надо ;-)
Prefer algorithm calls to hand-written loops (c) S.Meyers. :)
 
Сверху