Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #51 (permalink)  
Старый 30.07.2012, 19:32
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

bes,
Тест ( Выбрал 0 минимум и более 4 частей - для максимального разброса

<div id="div">
	<input value="999"> Число <br>
	<input value="9"> Количество частей <br>
	<input value="0"> Минимальное значение части<br>
	<input type="button" value="Разбить">
</div>

<script>
window.onload = function () {
	function f(num, part, min) {
		if (num / part < min) {
			alert('не реально');
			return;
		}
		var rest = num - min * part; 
		var mas = [];
		var elem = 0;
		for (var i = 1; i < part; i++) {
			elem = Math.round(rest * Math.random());
			mas.push(min + elem); 
			rest -= elem; 
		}
		mas.push(min + rest);
		return mas;
	}
	
	function check (elem) {
		if (isNaN(elem) == false && elem.value != '') {
			return true;
		} else {
			return false;
		}
	}
	
	var div = document.getElementById('div');
	
	div.children[6].onclick = function () {
		 var num = parseInt(div.children[0].value); 
		 var part = parseInt(div.children[2].value);
		 var min = parseInt(div.children[4].value);
		 if (check(num) && check(part) && check(min)) {
		 var arr = [];
		 for(var j=0; j<part;j++){
			 arr[j]=0;
		 }

		 var Ntest=300000;
		 for(var i=0; i<Ntest; i++){
		 
		 	var a = f (num, part, min); //alert(a)
		        for(var j=0; j<part; j++){ arr[j]+=a[j];if(i!=0)arr[j]=arr[j]/2}

	  	 } 
alert (arr.join('\n'))
		} else {
			alert('в полях есть не число')
		}
	}
	
}
</script>


Мну тест:

<style type="text/css">input{margin:4px;}</style>
<script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script>
<input id=Number type="text" value="999" > Число <br />
<input id=Nparts  type="text" value="9" > Кол-во разбиваемых частей<br />
<input id="Min-a"  type="text" value="0" >&nbsp;  Минимальное значение каждой части<br />
<input id="Rasbitt" type="button" value="Разбить">




<script type="text/javascript">
$(document).ready(function(){



function f (a, N, b) {
 var Arr = [];
 var Summ = 0;

    for(var i=0; i<N; i++){
       Arr[i] = Math.random();
       Summ+=Arr[i];
    }

 var DELTA_FromParts = (a - b*N);
 var Ost = a;
    for(var i=0; i<N-1; i++){
       Arr[i] = b + parseInt((DELTA_FromParts*Arr[i])/Summ)
       Ost-= Arr[i];
    }  Arr[N-1] = Ost;


   //alert(Arr);

return Arr;
}
$('#Rasbitt').click(function(e) {
 var a = parseInt($('#Number').val());
 var b = parseInt($('#Min-a').val());
 var N = parseInt($('#Nparts').val());

		 var arr2 = [];
		 for(var j=0; j<N;j++){
			 arr2[j]=0
		 }

		 var Ntest=300000;
		 for(var i=0; i<Ntest; i++){
		 
		 	var aa = f (a, N, b); //alert(aa)
		        for(var j=0; j<N; j++){ arr2[j]+=aa[j];if(i!=0) arr2[j]=arr2[j]/2}

	  	 }

alert (arr2.join('\n'))

  });
});
</script>

Последний раз редактировалось Deff, 31.07.2012 в 10:36.
Ответить с цитированием
  #52 (permalink)  
Старый 30.07.2012, 20:04
Аватар для Hekumok
Отправить личное сообщение для Hekumok Посмотреть профиль Найти все сообщения от Hekumok
 
Регистрация: 04.06.2012
Сообщений: 513

Deff, у мну ваш код разбивал число 2 часа, да еще и числа не целые получилис
Ответить с цитированием
  #53 (permalink)  
Старый 30.07.2012, 21:57
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Hekumok,
Это не разбивка а тест среднестатистического значения каждой из трех значений разбивки на выборке 2 000 000 кликов - оно там не нужно целым
первый тест формулы bes - второй - моей - надо сказать у мну секунд 15-20 работает(каждый) - частота проца 2.3 гига двух ядерка
уменьшил в 20 раз
Ответить с цитированием
  #54 (permalink)  
Старый 30.07.2012, 22:00
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Надо сказать, что при много значениях - рандом портицо

походу реальный рандом не более 10 000
Ответить с цитированием
  #55 (permalink)  
Старый 30.07.2012, 23:05
Аватар для Hekumok
Отправить личное сообщение для Hekumok Посмотреть профиль Найти все сообщения от Hekumok
 
Регистрация: 04.06.2012
Сообщений: 513

Сообщение от Deff Посмотреть сообщение
Hekumok,
Это не разбивка а тест среднестатистического значения каждой из трех значений разбивки на выборке 2 000 000 кликов - оно там не нужно целым
первый тест формулы bes - второй - моей
А, ясень)))
Ответить с цитированием
  #56 (permalink)  
Старый 31.07.2012, 18:51
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от Maxmaxmахimus
с равномерным распределеним вероятностей
Нет. Попробуйте RandomSplit(3, 3, 0). Первым числом в разбиении никогда не выпадет 3.
Ответить с цитированием
  #57 (permalink)  
Старый 31.07.2012, 22:55
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Сообщение от oneguy
В задаче нужно сделать, чтоб каждая возможность выпадала с одинаковой вероятностью
O RLY?

Сообщение от leny
Необходимо написать функцию деления числа "A" на несколько случайных, сумма которых в итоге будет числом "A".
Во-первых, "на несколько случайных" != "с равным шансом на одну из всех возможных комбинаций"
Во-вторых, ничего не сказано о том, что последовательность имеет значение.

А поэтому:
Сообщение от oneguy
Не нужно подгонять распределение под ваше решение
- что в такой же степени касается и вас. Но по большому счету, пока ТС не озвучил способ распределения вероятностей - любое решение, удовлетворяющее исходным условиям, будет технически правильным.

Расходимость наших решений в том, что у вас количество возможных ситуаций внутри функции с учетом динамики их возникновения равно
(a - m*n + n-1)! / (a - m*n)!

а у меня
(a - m*n + 1)^(n-1) * (n-1)!

Поэтому у вас все комбинации равновероятны, а у меня нет.

А вот ваша последняя функция мне понравилась. Я тоже решил попробовать двоичный поиск и комбинаторику, чтобы сделать все комбинации равновероятными. И хотя, ради чистоты эксперимента, в вашу функцию я нарочно не подглядывал, но всё же наши решения оказались очень похожи. Сравнение буду делать только на двоичном поиске, поэтому первый алгоритм из вашей функции я намеренно удалил.

function divide (a, n, m) { // by oneguy

  if (n*m>a) return;

  var b=[], d=[], p=a-(m-1)*n-1;

  for (i=0; i<n-1; i++) {
    var c=Math.floor(Math.random()*(p-i));
    var x=0, y=i;
    while (x<y) {
      var t=Math.floor((x+y)/2);
      if (d[t]-t>c) y=t; else x=t+1;
    }
    d.splice(x, 0, c+x);
  }
  d.push(p);

  b.length=0; b[0]=d[0]+m;
  for (i=0; i<n-1; i++) b.push(d[i+1]-d[i]+m-1);
  return b;
}

function SplitNum2 (a, n, m) { // by Дзен-трансгуманист

  if (n < 1 || n * m > a) { return []; }
  if (n == 1) { return [a]; }

  var i, j, q = -1, w, e;
  var r = a - (m * n) + n - 1;
  var f = Math.floor(Math.random() * r);
  var p = [f], s = [];

  for (i=1; i<n-1; i++) {
    if (!(i & (i-1))) { q++; }
    j = Math.floor(Math.random() * (r-i));
    if (j < f) { f = j; p.unshift(j); continue; }
    w = 1 << q;
    e = w >> 1;
    while (e) {
      if (w > i || j+w <= p[w-1]) { w -= e; }
      else if (w == i || j+w < p[w]) { break; }
      else { w += e; }
      e >>= 1;
    }
    p.splice(w, 0, j+w);
  }
  p.push(r);

  s[0] = p[0] + m;
  for (i=1; i<n; i++) { s[i] = p[i] - p[i-1] + m - 1; }
  return s;
}

function testPerformance (a, n, m, iterations) {

  var i, j, fn, time1, time2;
  var fnarr = [ "divide", "SplitNum2" ];
  var result = "a = " + a + "; n = " + n + "; m = " + m + ";   ( " + iterations + "x )\n\n";

  function Now () { return (new Date()).getTime(); }

  for (i=0; i<fnarr.length; i++) {
    fn = eval(fnarr[i]);
    time1 = Now();
    for (j=0; j<iterations; j++) { fn(a, n, m); }
    time2 = Now();
    result += fnarr[i] + ": " + ((time2 - time1) / 1000).toFixed(3) + " sec.\n";
  }

  return result + "\n";
}

var text = "";
text += testPerformance(130, 3, 20, 10000);
text += testPerformance(130, 30, 0, 1000);
text += testPerformance(100, 4, 25, 10000);
text += testPerformance(1000, 1000, 0, 10);
text += testPerformance(1000000000, 10000, 0, 1);
alert(text);
__________________

Гейзенберг, возможно, читал этот тред.

Последний раз редактировалось Дзен-трансгуманист, 02.08.2012 в 01:10.
Ответить с цитированием
  #58 (permalink)  
Старый 31.07.2012, 23:00
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Дзен-трансгуманист,
Чот соврал - и пол-секунды не было (Опера 11.52
Цитата:
<lookatcode.com>

a = 130; n = 3; m = 20; ( 10000x )

divide: 0.034 sec.
SplitNum2: 0.019 sec.

a = 130; n = 30; m = 0; ( 1000x )

divide: 0.045 sec.
SplitNum2: 0.052 sec.

a = 100; n = 4; m = 25; ( 10000x )

divide: 0.041 sec.
SplitNum2: 0.021 sec.

a = 1000; n = 1000; m = 0; ( 10x )

divide: 0.025 sec.
SplitNum2: 0.015 sec.

a = 1000000000; n = 10000; m = 0; ( 1x )

divide: 0.066 sec.
SplitNum2: 0.066 sec.
Ответить с цитированием
  #59 (permalink)  
Старый 31.07.2012, 23:06
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от Дзен-трансгуманист
Но по большому счету, пока ТС не озвучил способ распределения вероятностей
ТС наверное обучающую задачку на случайные числа дали и ему, ровно как и тому, кто дал ему эту задачку, абсолютно по барабану какое там у этих вероятностей распределение
Ответить с цитированием
  #60 (permalink)  
Старый 31.07.2012, 23:12
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Deff,
Черт-те что. Значит у меня Опера такая хреновая.

bes,
Судя по его игнору всей этой "высокой материи", так оно и есть.))
__________________

Гейзенберг, возможно, читал этот тред.

Последний раз редактировалось Дзен-трансгуманист, 31.07.2012 в 23:18.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите написать JavaScript ! Alamogoro Общие вопросы Javascript 4 24.05.2012 19:11
Помогите написать скрипт !!! Zander Элементы интерфейса 10 19.01.2012 14:40
Помогите плисс написать скрипт Gnusmus Events/DOM/Window 6 17.08.2011 15:51
Генератор случайных чисел. Помогите написать. Teenager Я не знаю javascript 5 05.01.2011 19:15
помогите написать аналог строки include("index.php?open=1") на js bushstas Общие вопросы Javascript 1 19.07.2009 02:48