Консультация № 109648
16.11.2007, 08:40
0.00 руб.
0 3 3
Здравствуйте!

Подскажите, пожалуйста, как можно реализовать генерацию случайного простого числа на javascript. Еще раз обращаю внимание, что число должно быть именно простым.

Спасибо.

Обсуждение

Неизвестный
16.11.2007, 11:12
общий
это ответ
Насколько я знаю, такой формулы нет, есть приближенные, но они не гарантируют 100% результат.
Придется создать массив простых чисел, а потом случайным образом выбрать один из его элементов. Алгоритм создания такого массива следущий:
Пробегая диапазон чисел от 1 до [сколько надо], добавляем текущее число в массив, если в этом массиве нет чисел на которое делится текущее число.
В конце концов получаем нужный набор чисел...
Чтобы не жрать много ресурсов, можно сгенерироать массив и забить его потом, как константу, чтобы не тратиться на его создание, т.е для быстрого выполнения скрипта...
Надеюсь с реализаацией проблем не будет...

Неизвестный
16.11.2007, 11:58
общий
это ответ
Здравствуйте, Konstant!

Мягко говоря предыдущий ответ содержит полный бред..., поскольку существует общеизвесный алгоритм проверки числа является ли оно простым или нет!

Достаточно сгенерировать число <b>х</b>, и достаточно посчитать все его делители начиная с <b>2</b> и до самого числа <b>х</b>, если таких делителей все ОДИН, то мы говорим что это простое число. А если воспользоватся алгеброй, то можно еще ускорить данный поцесс и считать делители от <b>2</b> до <b>√х</b>.

В приложении полностью страница со скриптом, при загрузке страницы на экран выводится произволльное простое число от 1 до 1000.

А вот код алгоритма приведенного выше.
<code><script>
function getRandom() {  return Math.round(1000*Math.random());}

function prostoe()
{
t=true;
while (t)
{
k=0;
x=getRandom();
for (var i = 2; i <= Math.sqrt(x); i++)
{
if (x%i == 0) {k++;}
}
if (k == 0) {t=false;}
}
document.write(x);
}
</script></code>

Good Luck!!!

Приложение:
<html><script>function getRandom() {  return Math.round(1000*Math.random());}function prostoe(){ t=true; while (t) { k=0; x=getRandom(); for (var i = 2; i <= Math.sqrt(x); i++) { if (x%i == 0) {k++;} } if (k == 0) {t=false;} } document.write(x);}</script><body onload="prostoe()"></body></html>
Неизвестный
16.11.2007, 13:29
общий
это ответ
Здравствуйте, Konstant!

Я бы, наверное, назвал свой метод "ленивым", так как в нём не происходит реальной генерации простых, да ещё и случаных, чисел.

Приступим.

Создаём .js файл с массивом содержащим простые числа (список, довольно не маленький, можно нарыть в интернете. на той же википедии, скажем).

а потом просто генерирум случайное число от ноля до "длина массива минус один"
и вытаскиваем простое число из полученого индекса.

чтобы получить случайное число в джаваскрипт можно использовать вот этот код:

var primeArrayLength = 100; // допустим, что у нас в массиве 100 простых чисел
var randomnumber=Math.floor(Math.random()*primeArrayLength);

Если нужно, чтобы последовательность "генерируемых случайных" простых чисел не содержала повторений, что может произойти, то делаем так.

по получению индекса массива берём содержимое ячейки и переносим в конец массива. Напирмер:

Имеем массив: 2,3,5,7,11,13,17,19,23
получаем индекс 4
запоминаем число 11. сдвигаем массив и дописываем число 11 в конец.
Теперь массив выглядит вот так: 2,3,5,7,13,17,19,23,11

Остальсь уменьшить переменную содержащую длину массива на 1.

primeArrayLength--;

и можно снова генерировать индекс не боясь, что снова выпадет индекс 4.
потому что даже если и выпадет, то
1) там уже совершенно иное число, и
2) число 11 тоже не выпадет так как случайный индекс не будет равнятся индексу последнего члена массива после того, как мы уменьшили переменную на 1.

Конечно, полностью избежать повторений не возможно и если генерация происходит в бесконечном цикле то, когда переменая primeArrayLength станет равнятся нулю, нужно будет вновь присвоить ей значение длины массива.

Таким образом случайность "генерирумых" простых чисел зависит от длины Вашего массива.

Удачи.
Надеюсь, что не сильно загрузил :-))
Форма ответа