Javascript-форум (https://javascript.ru/forum/)
-   Учебные материалы (https://javascript.ru/forum/study/)
-   -   Нужен генератор случайных чисел без Math.random (https://javascript.ru/forum/study/72660-nuzhen-generator-sluchajjnykh-chisel-bez-math-random.html)

Kirill_98 15.02.2018 14:22

Нужен генератор случайных чисел без Math.random
 
Помогите сделать код есть вот такая формула "Если пользователю потребуется, чтобы случайное число x находилось в интервале (a; b), отличном от (0;1), нужно воспользоваться формулой x=a+(b-a)*r, где r - случайное число из интервала (0;1)."

Nexus 15.02.2018 14:25

Помочь вам написать генератор псевдослучайных чисел? :)

j0hnik 15.02.2018 14:30

без Math.random? но почему? :blink:
можно по колдовать с тайм кодом. с ms

Nexus 15.02.2018 14:33

Цитата:

Сообщение от j0hnik
но почему?

Вероятно религия не позволяет )

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

j0hnik 15.02.2018 14:40

Nexus,
как его еще получить?

Nexus 15.02.2018 14:41

function rand(){
	return (new Date()).getMilliseconds()/1000;
};

alert(rand()+'; '+rand());

Nexus 15.02.2018 14:41

j0hnik, понятия не имею, мне всегда Math.random хватало.

Kirill_98 15.02.2018 14:44

Цитата:

Сообщение от Nexus (Сообщение 478209)
Помочь вам написать генератор псевдослучайных чисел? :)

да пожалуйста помогите, перерыл весь интернет уже голова как чугунка:cray: , я бы и сам написал через Math.random там в принципе и писать нечего:write: , но по заданию надо без функции :help: :help: :help:

j0hnik 15.02.2018 14:45

Цитата:

Сообщение от Nexus (Сообщение 478213)
function rand(){
	return (new Date()).getMilliseconds()/1000;
};

alert(rand()+'; '+rand());

да это понятно

Kirill_98 15.02.2018 14:52

и еще один вопрос, как сделать так чтобы число генерировалось в заданном в ручную диапазоне например от 1 до 10?

j0hnik 15.02.2018 14:56

Kirill_98,
var rnd =(a, b)=> Math.floor(('0.'+ new Date().getMilliseconds()) * (b - a)) + a;
console.log(rnd(10,20));

Nexus 15.02.2018 14:56

Цитата:

Сообщение от Kirill_98
да пожалуйста помогите, перерыл весь интернет уже голова как чугунка

Вам в раздел "работа", это далеко не тривиальная задача :)
Мне даже интересно взялся бы кто-нибудь действительно писать ГПСЧ.

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

j0hnik 15.02.2018 15:14

Kirill_98,
var rnd =(a, b)=> Math.floor(('0.'+ (new Date().getMilliseconds()+''.slice(1)) ) * (b - a)) + a;
console.log(rnd(0,100));

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

Kirill_98 15.02.2018 15:22

Цитата:

Сообщение от j0hnik (Сообщение 478224)
Kirill_98,
var rnd =(a, b)=> Math.floor(('0.'+ (new Date().getMilliseconds()+''.slice(1)) ) * (b - a)) + a;
console.log(rnd(0,100));

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

:lol: :lol: :lol: :lol:
я попробывал сделать вот так
function rand(){
                return (new Date()).getMilliseconds()/1000;
            };

			function getRandomCount(){
				var resultObject = document.getElementById('resultPlace');
				resultObject.innerHTML = "";
				for (var i = 0; i < 5; i++) {
					 var a = Number (document.getElementById('a').value);
					 var b = Number (document.getElementById('b').value);
					 var result = a + (b - a) * rand();
					 resultObject.innerHTML += "<br>Сгенерированное число: " + result;
				}
			}
		</script>

вопрос как сделать так чтобы выкидывал допустим 5 разных чисел, в моем коде он выдает одно и тоже число 5 раз

j0hnik 15.02.2018 15:36

var rnd =(a, b)=> {
	var n = 99999900;
	while(n--) n;
	return Math.floor(('0.'+ (new Date().getMilliseconds()+''.slice(1)) ) * (b - a)) + a;
};
console.log(rnd(0,100)+'--'+rnd(0,100)+'--'+rnd(0,100)+'--'+rnd(0,100)+'--'+rnd(0,100));


Nexus проблема решена

рони 15.02.2018 15:46

генератор случайных чисел без Math.random
 
Цитата:

Сообщение от Kirill_98
Нужен генератор случайных чисел без Math.random

Цитата:

Сообщение от Kirill_98
и еще один вопрос, как сделать так чтобы число генерировалось в заданном в ручную диапазоне например от 1 до 10?

где-то было ... искать иль снова написать вот чём вопрос? :lol:
<script>
function rund(b) {
    var a = (new Date).getMilliseconds();
    return function() {
        a = (25173 * a + 13849) % 65536;
        return a % b + 1
    }
};

var x =  rund(10);
for (var i=0; i< 1000; i++)  document.write(x()+",")
  </script>

Nexus 15.02.2018 15:48

Цитата:

Сообщение от j0hnik
Nexus проблема решена

:lol:

j0hnik 15.02.2018 15:59

Рони, прокомментируй
a = (25173 * a + 13849) % 65536;

j0hnik 15.02.2018 15:59

рони,
есть варианты генерировать без date?

Nexus 15.02.2018 16:02

var __rand_last_val, __rand_last_time;

function rand() {
    var res = (new Date()).getMilliseconds() / 1000;
    if (res == __rand_last_time)
        res = res * +('0.' + __rand_last_val.toString().substr(-2)) + __rand_last_val / 1000;
    else
        __rand_last_time = res;

    return __rand_last_val = res;
};

var i = 10,
    r = []
while (i--)
    r.push(rand());


console.log(r);

рони 15.02.2018 16:06

Цитата:

Сообщение от j0hnik
Рони, прокомментируй
a = (25173 * a + 13849) % 65536;

Линейный конгруэнтный метод

j0hnik 15.02.2018 16:18

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

j0hnik 15.02.2018 16:25

https://www.youtube.com/watch?v=eRFgIh-raT8

Коллеги на погоде надо генерировать!

Kirill_98 15.02.2018 18:33

Цитата:

Сообщение от j0hnik (Сообщение 478242)
https://www.youtube.com/watch?v=eRFgIh-raT8

Коллеги на погоде надо генерировать!

это я своему преподу дам пусть посмотрит :) :) :) :) :) :) :) :)

j0hnik 15.02.2018 23:52

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>
	min	<input type="number" min="0" max="999999" value="0" id="inp1"><br>
	max <input type="number" min="0" max="999999" value="10" id="inp2"><br>
	чисел <input type="number" min="0" max="100" value="1" id="inp3"><br>
	<button>Кнопка</button>
	<div id="text"></div>
	<script>
		$('button').click(function(){
			var data = {
				'jsonrpc': '2.0',
				'method': 'generateIntegers',
				'params': {
					'apiKey': '00000000-0000-0000-0000-000000000000',
					'n': inp3.value,
					'min': inp1.value,
					'max': inp2.value,
					'replacement': true,
					'base': 10
				},
				'id': 2601
			};

			$.ajax({
				url: 'https://api.random.org/json-rpc/1/invoke',
				type: "POST",
				data: JSON.stringify(data),
				contentType: "application/json; charset=utf-8",
				dataType: "json",
				success: function(result) {
					$('#text').html(result.result.random.data.toString());
				}
			});
		});

	</script>
</body>
</html>


вот трушный рандом, сгенерированный на основе атмосферного шума! преподу привет.

Aetae 16.02.2018 01:19

function getRandom(a, b){
  var r = window.crypto.getRandomValues(new Uint32Array(1))/0xffffffff;
  var x = a+(b-a)*r;
  return x
}

Вот вам без Math.random().:)

Но если не использовать никаких API, а лишь чистый javascript - то и получить соответственно можно лишь псевдослучайные числа. А псвевдослучайные и случайные - две большие разницы.
Алгоритмов же для псевдослучайных чисел навалом, гуглите да копипастите. При всех алгоритмических хитростях принцип и результат един.

Kirill_98 16.02.2018 12:03

Всем коллегам привет, препод сказал еще один способ получения СЧ, подстановка чисел и что они там как то меняться должны я чет вообще не догнал может кто сталкивался ?

рони 16.02.2018 12:28

Цитата:

Сообщение от Kirill_98
подстановка чисел

недостаточно информации

Белый шум 16.02.2018 12:58

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

Вспоминай что было на парах, никак иначе не понять чего он хочет.

Kirill_98 16.02.2018 13:23

прикол в том что он не преподавал

Kirill_98 16.02.2018 13:28

Цитата:

Сообщение от рони (Сообщение 478360)
недостаточно информации

http://stratum.ac.ru/education/textb...lection22.html

в статье есть метод перемешивания скорей всего это оно и есть, и еще одно данная статья использовалась у меня на предмете

j0hnik 16.02.2018 16:25

почитал вашу статью, всю математику можно переменить в JS , но чем генерировать 1 и 0 ? из того что нашел в статье и применимо в целом к JS это подкидывать монетку, вбивать в input значения, например 1-орел, 0-решка, и пропускать через вашу формулу. или другой подобный тому нехитрый метод.

Kirill_98 16.02.2018 17:40

Цитата:

Сообщение от j0hnik (Сообщение 478397)
почитал вашу статью, всю математику можно переменить в JS , но чем генерировать 1 и 0 ? из того что нашел в статье и применимо в целом к JS это подкидывать монетку, вбивать в input значения, например 1-орел, 0-решка, и пропускать через вашу формулу. или другой подобный тому нехитрый метод.

а как это реализовать ?

Белый шум 16.02.2018 17:49

Цитата:

Сообщение от j0hnik
почитал вашу статью, всю математику можно переменить в JS , но чем генерировать 1 и 0 ?

Читать надо только про метод перемешивания. Начальное значение, видимо, нужно задавать отдельно.

рони 16.02.2018 17:56

Цитата:

про метод перемешивания
не смог создать цепочку длиннее 4 , примерно так 50,84,102,50,84,102,50,84,102,50,84,102,50,84,102, 50,84,102,50,84,102,50,84,102,50,84,102,
кто сделает больше?

Белый шум 16.02.2018 20:14

<head>
  <script type="text/javascript" src="//code.jquery.com/jquery-1.9.1.js"></script>
  <style>
      .c0 {color:blueviolet;}
      .c1 {//color:red;}
      .c0, .c1 { position:relative; font-family:monospace;}
      .bits {color:brown; position:absolute; left:100pt;}
  </style>
</head>
<body>
  <button id="b">ещё</button> (<span id="num">0</span>)
  <div id="r"></div>
  <script>
	var r0 = 285017901, clr = true, cnt = num = 0;

	function random() {
//console.log('r0:', r0.toString(2).padStart(32, '0'));
		var left = ((parseInt('01111111110000000000000000000000', 2) & r0) >>> 23);
		var r1 = (r0 << 10 >>> 1) | left;
//console.log('r1:', r1.toString(2).padStart(32, '0'));

		var right = ((parseInt('111111111', 2)) & r0) << 24 >>> 1;
		var r2 = (r0 >>> 9) | right;
//console.log('r2:', r2.toString(2).padStart(32, '0'));

		r0 = r1 + r2;
		$('#r').prepend($('<div>'+r0+'	 <span class="bits">'+ (r0.toString(2).padStart(32, '0')) +'</span>'+'</div>').addClass('c'+Number(clr)));
		//console.log('r0:', r0.toString(2));

		if(++cnt >= 5) {
			clr = !clr;
		 	cnt = 0;
		}
		$('#num').text(++num);
	}
	$('#b').on('click', random);
  </script>
</body>

рони 16.02.2018 21:09

Белый шум,
:)

Kirill_98 16.02.2018 21:27

Цитата:

Сообщение от Белый шум (Сообщение 478409)
<head>
  <script type="text/javascript" src="//code.jquery.com/jquery-1.9.1.js"></script>
  <style>
      .c0 {color:blueviolet;}
      .c1 {//color:red;}
      .c0, .c1 { position:relative; font-family:monospace;}
      .bits {color:brown; position:absolute; left:100pt;}
  </style>
</head>
<body>
  <button id="b">ещё</button> (<span id="num">0</span>)
  <div id="r"></div>
  <script>
	var r0 = 285017901, clr = true, cnt = num = 0;

	function random() {
		var left = ((parseInt('11111111100000000000000000000000', 2) & r0) >> 23);
		var r1 = (r0 << 10 >>> 1) | left;

		var right = (parseInt('111111111', 2)) & r0;
		var r2 = (r0 >>> 9) | right;

		r0 = r1 + r2;
		$('#r').prepend($('<div>'+r0+'	 <span class="bits">'+ (r0.toString(2).padStart(32, '0')) +'</span>'+'</div>').addClass('c'+Number(clr)));
		//console.log('r0:', r0.toString(2));

		if(++cnt >= 5) {
			clr = !clr;
		 	cnt = 0;
		}
		$('#num').text(++num);
	}
	$('#b').on('click', random);
  </script>
</body>

пожалуйста можете объяснить как работает код ? И еще у меня он почему то не работает
jquery-1.9.1.js Failed to load resource: net::ERR_FILE_NOT_FOUND
rand.html:34 Uncaught ReferenceError: $ is not defined
at rand.html:34
после того как добавил <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.js"></script>
rand.html:25 Uncaught TypeError: r0.toString(...).padStart is not a function
at HTMLButtonElement.random (rand.html:25)
at HTMLButtonElement.dispatch (jquery-1.9.1.js:3074)
at HTMLButtonElement.elemData.handle (jquery-1.9.1.js:2750)

Белый шум 16.02.2018 22:00

Kirill_98,
Удали падстарт либо обнови браузер -
https://developer.mozilla.org/ru/doc...tring/padStart

А работает он в соответствии с алгоритмом по твоей ссылке, только я взял смещение в 9 бит (в js числа 32-битные ЕЯПО, минус 1 бит на знак).

Белый шум 16.02.2018 22:20

Вернее, немного не соответствовал. Сейчас поправил, теперь должен соответствовать вроде. С цифирками можно поиграться, если где-то накосячил (я просто сам принцип проверял, а не домашку за студента делал).


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