X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Уникальность генерируемых чисел
nikanor
nikanor
Topic Starter сообщение 8.3.2010, 14:39; Ответить: nikanor
Сообщение #1


Добрый день.
Моя цель сгенерировать ряд случайных уникальных чисел.

mas_gen_number = new Array(); //массив сгенерированных чисел

//генерация случайных чисел от min до max
function generate_number(min, max){
    
   var temp_number = min + Math.floor((max-min)*Math.random()); //временная переменная
        
   //проверка повторений
   for(i=0; i<mas_gen_number.length; i++)        
      if(temp_number == mas_gen_number[i])
         generate_number(min_number, max_number); //повторная генерация числа
        
    mas_gen_number [mas_gen_number.length] = temp_number; //сохранить число в массив
        
    return temp_number;
}


Несмотря на проверку, периодически встречаются повторяющие числа. В чем моя ошибка?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Letmetouchyou
Letmetouchyou
сообщение 8.3.2010, 15:54; Ответить: Letmetouchyou
Сообщение #2


        <script>
    var  mas_gen_number = [];
                function generate_number(min, max){
                   if (mas_gen_number.length >= (max-min+1) ){
                             alert('сгенерированы все числа');
                             return 'сгенерированы все числа';
                            }
                   var temp_number = Math.floor((Math.random())*(max+1 - min) + min); //временный массив
                   //проверка повторений
                   for(i=0; i<mas_gen_number.length; i++)
                      if(temp_number == mas_gen_number[i]){
                         generate_number(min, max); //повторная генерация числа
                        return false;
                        }

                    mas_gen_number.push(temp_number); //сохранить число в массив

                    //alert(mas_gen_number.length)
                    alert(temp_number);
                    return temp_number;
                }
        </script>
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
nikanor
nikanor
Topic Starter сообщение 8.3.2010, 16:45; Ответить: nikanor
Сообщение #3


Letmetouchyou, Вы так и не ответили, где у меня ошибка. Функция работает, но иногда встречаются дубли. Объясните, пожалуйста, новичку, в чем ошибка логики в моей функции?

P.S.: немного подправил код функции.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
сообщение 8.3.2010, 17:35; Ответить: ZhukV
Сообщение #4


А где ты закрываеш цыкл for()? Вот и ошибка :goodpost:
Лучше сделать отельную функцию проверки значения в массиве, и забросить ее в прототип.
mas_gen_number [mas_gen_number.length] = temp_number;

Это не очень верно, относительно добавление значения в массив!!!
mas_gen_number.push(temp_number)

А вот это верно!!!!
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Letmetouchyou
Letmetouchyou
сообщение 8.3.2010, 20:16; Ответить: Letmetouchyou
Сообщение #5


ZhukV, во первых ето не все и ето не ркитическая ошибка.

nikanor, суть в том что в
   //проверка повторений
   for(i=0; i<mas_gen_number.length; i++)        
      if(temp_number == mas_gen_number[i])
         generate_number(min_number, max_number); //повторная генерация числа

следует не просто вызывать функцию а и заканчивать текущуюю.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
nikanor
nikanor
Topic Starter сообщение 8.3.2010, 21:49; Ответить: nikanor
Сообщение #6


(ZhukV @ 8.3.2010, 19:35) *
А где ты закрываеш цыкл for()? Вот и ошибка

ZnukV, цитирую из учебника: "Тело цикла представляется обычно блоком операторов, обозначаемого фигурными скобками. Если тело цикла состоит из одного оператора, фигурные скобки не нужны."
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
nikanor
nikanor
Topic Starter сообщение 8.3.2010, 21:56; Ответить: nikanor
Сообщение #7


(Letmetouchyou @ 8.3.2010, 22:16) *
следует не просто вызывать функцию а и заканчивать текущуюю.


Я бы с удовольствием, но если я верну false, то ячейка примет совсем не правильное значение. Вот фрагмент с вызовом функции:

//заполнение ячеек
for (var j=0; j < quantity_cells; j++)
   document.all["cell" + i + j].innerHTML = generate_number(min_number, max_number);
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Letmetouchyou
Letmetouchyou
сообщение 8.3.2010, 22:46; Ответить: Letmetouchyou
Сообщение #8


nikanor, пример который я дал рабочий )
посел ретёрна идет поторный вызов функции
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
nikanor
nikanor
Topic Starter сообщение 8.3.2010, 23:30; Ответить: nikanor
Сообщение #9


Letmetouchyou, последовал я Вашему совету:

//проверка повторений
for(i=0; i<mas_gen_number.length; i++)
   if(temp_number == mas_gen_number[i]){
      generate_number(min, max); //повторная генерация числа
      return false;
   }


В результате, если встречаются дубли, то возвращается false, и вместо числового значения отображается false.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
nikanor
nikanor
Topic Starter сообщение 9.3.2010, 0:46; Ответить: nikanor
Сообщение #10


Нашел выход из положения:

//генерация случайных чисел от min до max
function generate_number(min, max){
        
   while(true){
        
      var double_number = false; //повторения отсутствуют
            
      var temp_number = min + Math.floor((max-min)*Math.random()); //генерация случайного числа
            
      //проверка повторений
      for(i=0; i<mas_gen_number.length; i++)
         if(temp_number == mas_gen_number[i])
            double_number = true; //повторения присутствуют
            
      //повторения отсутствуют
      if (!double_number) break;
   }

   mas_gen_number [mas_gen_number.length] = temp_number; //сохранить число в массив
        
   return temp_number;
}


Принимавшим участие в решении моего вопроса жму "Спасибо".
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Рерайт на заказ!, Уникальность от 95%
Высокая уникальность текста. Большие объемы!
10 Akira 4892 29.12.2015, 17:43
автор: Akira
Открытая тема (нет новых ответов) Какой сайт или программа хорошо проверяет текст на уникальность?
24 Albi 4799 20.5.2015, 20:53
автор: Марина123
Открытая тема (нет новых ответов) Как проверить контент на уникальность?
8 Димка_mw 2077 20.5.2015, 10:32
автор: Triniti_Wel_mw
Открытая тема (нет новых ответов) Готовые статьи, высокая уникальность, женская тематика
0 ViktoriNa 1145 9.5.2015, 0:27
автор: ViktoriNa
Открытая тема (нет новых ответов) Статьи на тематику: "Ремонт и благоустройcтво жилья". Уникальность 95% и выше
2 iroglify 2175 4.4.2015, 3:27
автор: iroglify


 



RSS Текстовая версия Сейчас: 20.4.2024, 20:35
Дизайн