Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Задачка по генерации чисел (https://javascript.ru/forum/misc/60372-zadachka-po-generacii-chisel.html)

EmperioAf 26.12.2015 14:33

Ув. рони,
Ув. Deff,
объясните пожалуйста чем плох код, предложенный Ruslan_xDD в этом посте?
То, что он предложил легко читается и очевидное решение. А ваши решения выглядят со стороны как навороты. Только без обид. Просто любопытно

Deff 26.12.2015 14:59

Цитата:

Сообщение от EmperioAf
Просто любопытно

1. Есть некая соревновательсть в решениях, типично в топиках коротких скриптов и кодов, и достаточно нередко используемых
Автор уже доволен, но применяемый код мон вылизать.
Где-то был даж спец. топик с такими скриптами-задачками
==================================
К примеру у нас с Рони как то была задача протестить код на миллионе повторов. При неотлизанном коде - это часы...
К примеру тот жа Math.random() на массиве в 10 элементов вызывается средне=статистически при таких функциях неповторяющейся выборки 29 раз - на 20 - 70 при дальнейшем увеличении массива растёт в какой-то степени(посколь попадает в уже выбранные значения)
Т.е. время на коротких массивах растёт вдвое-втрое

рони 26.12.2015 15:12

Цитата:

Сообщение от Deff
Или ты не об этом ?

посмотри что выдаёт функция indRand :)

Deff 26.12.2015 15:19

Цитата:

Сообщение от рони
посмотри что выдаёт функция indRand

Тещу в Опере и Мозилле - всё в норме... (Сделай красивый скриншот плиз.. мож я не выспался...
======================

рони 26.12.2015 15:20

EmperioAf,
код Ruslan_xDD генерирует числа Math.random более 20 раз чтоб избежать повторов, мой код генерирует только 20 раз и без повторов.

рони 26.12.2015 15:20

Deff,
в консоли посмотри :)

Deff 26.12.2015 15:57

рони,
Ок :(
================
// Тест средне-статистического числа повторов Math.random() на создание неповторяющегося массива из 1000 элементов
function indexRandom(lng){
    var numRnd = 0;
     var a = {},i,out=[],n=0; 
     while (n!=lng){
       i = Math.floor(lng*Math.random()); numRnd++;
       if(typeof(a[i])=='undefined'){
         a[i]=i; out.push(i);
         n++;
       }
     }
    return numRnd;
  }
function repeat(n){
  var N=0;n2=n
  while (--n2){
     N+= indexRandom(1000);
  }
  return N/n;
}
alert('N='+repeat(10000))


// Тест средне-статистического числа повторов Math.random() на создание неповторяющегося массива из 20 элементов
function indexRandom(lng){
    var numRnd = 0;
     var a = {},i,out=[],n=0; 
     while (n!=lng){
       i = Math.floor(lng*Math.random()); numRnd++;
       if(typeof(a[i])=='undefined'){
         a[i]=i; out.push(i);
         n++;
       }
     }
    return numRnd;
  }
function repeat(n){
  var N=0;n2=n
  while (--n2){
     N+= indexRandom(20);
  }
  return N/n;
}
alert('N='+repeat(10000))


// Тест средне-статистического числа повторов Math.random() на создание неповторяющегося массива из 10 элементов
function indexRandom(lng){
    var numRnd = 0;
     var a = {},i,out=[],n=0; 
     while (n!=lng){
       i = Math.floor(lng*Math.random()); numRnd++;
       if(typeof(a[i])=='undefined'){
         a[i]=i; out.push(i);
         n++;
       }
     }
    return numRnd;
  }
function repeat(n){
  var N=0;n2=n
  while (--n2){
     N+= indexRandom(10);
  }
  return N/n;
}
alert('N='+repeat(10000))

=======================
Зы: Примерная апроксимация кол-ва обращений к Math.random() по четырём точкам:
n - длина массива
x = n+n^1.26

рони 26.12.2015 16:01

Цитата:

Сообщение от Deff
while (n--) out.push(a.splice(Math.floor((n+1)*Math.random()), 1)[0]);

:-?

Deff 26.12.2015 16:21

рони,
СПС, - я понял, тут отвлекают(отхожу от компа + возгорелся протестить: А скок реально рандомов лишних ? ) поэтому долго с правкой того поста

Deff 26.12.2015 16:31

рони,
А эту феньку видел ?
function abc(arr){
  var a = arr.splice(0,3);
}

var arr = [1,2,3];
abc(arr);
alert('>'+arr+'<')


function abc(arr){
  function abcd(ar2){
     var a = ar2.splice(0,3);
  }
  abcd(arr)
}

var arr = [1,2,3];
abc(arr);
alert('>'+arr+'<')


function abc(arr){
  arr=[];
}

var arr = [1,2,3];
abc(arr);
alert('>'+arr+'<')


Часовой пояс GMT +3, время: 05:29.