10 случайных, неповторяющихся чисел

maximus007

Новичок
10 случайных, неповторяющихся чисел

Помогите пожалуйста куском скрипта, который выдает 10 случайнх, не повторяющихся чисел на промежутке от 0 до определенного значнеия. У меня мозг уже отключился, вааще не думает, с утра нужно работу сдать. Можно коенчно перебор сравнить все, но это не рационально. Пасиба большое всем, кто поможет.

-~{}~ 08.07.08 01:27:

Я думаю, что с утра тема будет еще актуальна))
 

Bitterman

Новичок
А чем нерационально проверять все предыдущие? Тем более, что другого варианта так сразу в голову и не приходит. Проверять, правда, не перебором, а, например, in_array.
 

Bitterman

Новичок
Без понятия, честно говоря, как работает in_array, может быть и перебором, но, во-первых, это системная функция, которая вполне возможно быстрее, во-вторых, это существенное сокращение объема кода.
 

maxwell

artifex
Bitterman, зачем писать раз в голову не приходит?


maximus007, заполни массив числами от 0..N, потом сортируй случайно, потом бери сколько тебе надо.
 

Krishna

Продался Java
maxwell
ппц, в Риге все такие гении?
А если ему надо до 1.000.000 значения? Мильённый массив сортировать будешь, чтобы 10 случайных чисел получить, "теоретик"?
Вариант Bitterman самый нормальный.
 

Farsh

~ on ~ high ~ wave ~
Re: 10 случайных, неповторяющихся чисел

Автор оригинала: maximus007
Помогите пожалуйста куском скрипта, который выдает 10 случайнх, не повторяющихся чисел на промежутке от 0 до определенного значнеия. У меня мозг уже отключился, вааще не думает, с утра нужно работу сдать. Можно коенчно перебор сравнить все, но это не рационально. Пасиба большое всем, кто поможет.

-~{}~ 08.07.08 01:27:

Я думаю, что с утра тема будет еще актуальна))
PHP:
$limit = 10;
$max_num = 20;
$used_nums = array();
while(1) {
  $random = rand(0, $max_num);
  if(!in_array($random, $used_nums)) {
     $used_nums[] = $random;
  }
  if(count($used_nums) == $limit) { break; }
}
var_dump($used_nums);
Помоему проще уже некуда =)
 

rotoZOOM

ACM maniac
Тогда уж
PHP:
$limit = 10;
$max_num = 20;
$used_nums = array();
while($limit) {
  $random = rand(0, $max_num);
  $limit-=!isset($used_nums[$random]);
  $used_nums[$random]=true;
}
var_dump($used_nums);
 

maxwell

artifex
Krishna, а если есть необходимость сгенерить 10^6 случайных чисел от 0..10^12?
У моего варианта мы по крайней мере точно знаем, когда закончим.
Если из нужно получить 10 случайных чисел от 0 до 10^6 то и in_array не нужен.

Да, в Риге все такие умные.
 

Gas

может по одной?
maxwell
твой вариант имеет право на существование для небольших промежутков (сам его использую), но не для диапазона в миллион.

range(0, 1000000) чудесно сообщает
Fatal error: Allowed memory size of 16777216 bytes exhausted
 

Krishna

Продался Java
maxwell
Русским языком написано - 10 чисел. А вот размер диапазона значений - неограничен.

Да, я уже вижу. Хватает на повыпендриваться, высосав из пальца выдуманные дополнительные условия.

У моего варианта мы по крайней мере точно знаем, когда закончим.
Прикинь, для его алгоритма можно справиться ровно за 10 вызовов генератора рандома, если есть такая необходимость.

Оставляю в качестве домашнего задания.
 

kode

never knows best
PHP:
function getrandomnumbers($count,$max){
	$numbers = array();
	while(true){
		$numbers[] - rand(0,$max);
		$numbers = array_unique($numbers);
		if(count($numbers)==$count){
			break;
		}
	}

	return $numbers;
}
вариантов - миллион и маленький самосвал

-~{}~ 08.07.08 13:20:

ох, как меня ДОСТАЛО это кеширование на похапеклабе....АРРР
 

kode

never knows best
.

-~{}~ 08.07.08 14:17:

:) просто изначально было так:

....

if(count($numbers)==$count){
return $numbers;
}
...
 

maxwell

artifex
Krishna, процитируйте пожалуйста где я выпендривался, чтобы не быть голословным.

Ну да, 10 чисел, завтра надо будет 11, а мы не умеем уже. Настоящий тру-програмерский метод.
Я же нигде не писал что мой метод самый правильный.


Gas, memory_limit...

По теме:
Как правильно заметил Gas, если стоит задача сгенерить N случайных чисел, без повторений, от 0 до K, при этом (K-N) довольно маленькое число, лучше использовать предложенный мною алгоритм.

Автору решать что в его конкретной задаче лучше.
 

HraKK

Мудак
Команда форума
PHP:
<?php
$array[0]=rand();
$i=0;
while($i<9)
{
++$i;    
$array[$i]=rand($array[$i-1],$array[$i-1]+rand());
}
print_r(shuffle($array));
?>
 

maxwell

artifex
Wicked
Это все что вы поняли из моих постов?

HraKK
shuffle — вроде булевская функция, но не в этом дело.
Написанное — бред.
 
Сверху