Существует математическая проблема, это проблема генерации последовательности из n уникальных случайных чисел (случайное число является элементом N {0, ..., n}, (как перестановка, но без использования памяти)
Недавно я решил эту проблему, и я получил некоторый результат (читай ниже, без использования формальной математики, просто путем программирования).
и кажется, что эта проблема уже была решена в прошлом путем построения LFSR (Линейный регистр сдвига с обратной связью) Галуа или какого-то другого математика. (Я действительно впервые узнал о LFSR, а затем создал свой «вид» решения, потому что я не мог понять статью LFSR на вики и не хотел просто скопировать и вставить исходный код)
Дело в том, что я не понимаю слова формальной математики и хотел бы выучить его и сравнить мое решение с решением LFSR, поэтому вопрос:
Можете ли вы сравнить то, что я сделал с этой вещью, и каким-то образом перевести это на формальную математику и наоборот. чтобы я мог понять, что я делал и что делали формальные математики (и зачем им это было нужно)?
помните, что мой язык программирования - я понимаю только память и ее адресацию, состояния памяти, строки нулей и единиц и т. Д., И я не понимаю примитивных полиномов, теории поля и других математических слов.
Большое спасибо заранее, если ты мне поможешь, я куплю тебе пива, когда увижу тебя.
Вот мой код ниже (вы можете запустить его в браузере, я не говорю, что это правильно, но я верю, что идея должна быть близка, у меня нет других идей, как ее решить.):
<html>
<head>
<script>
//-------------------------------------------------
function getPlacement( num ){ //; knuth permutations
var places = [];
for( var i = 0; i < num; ++i )
places.push( i );
var last_index = num-1;
for( var i = num; i > 0; --i ){
var rnd_index = Random( i );
places = swap( places, rnd_index, last_index );
last_index--;
}
return places;
}
function readNum( num, placement ){
var numstr = num.toString(2);
numstr = zeroextend( numstr, placement.length );
var numarr = numstr.split('');
var ret = [];
for( var i = 0; i < placement.length; ++i ){
ret.push( numarr[ placement[i] ] );
}
return ret.join('');
}
function UniqRndSeq( maxLength, output ){
var placesNeeded = maxLength.toString(2).length;
var randomPlacement = getPlacement( placesNeeded );
var initPosition = Random( maxLength );
var cnt = initPosition;
var rndn;
var numret = [];
do{
rndn = parseInt( readNum( cnt, randomPlacement ), 2);
output( rndn );
if( Containz( numret, rndn ) ) alert(rndn);
numret.push(rndn);
++cnt;
cnt = cnt % maxLength;
} while( cnt != initPosition );
}
//-------------------------------------------------
//; helper funs
var outp = [];
function display( num ){
outp.push( num + "<br>" );
}
function Random( x ){
return Math.floor(Math.random()*x);
}
function Containz( arr, num ){
for( var i = 0; i < arr.length; ++i ){
if( arr[i] == num ) return true;
}
return false;
}
function swap( list, a, b ){
var tmp = list[a];
list[a] = list[b];
list[b] = tmp;
return list;
}
function zeroextend( num_bin_str, length ){
while( num_bin_str.length != length ){
num_bin_str = "0" + num_bin_str;
}
return num_bin_str;
}
//-------------------------------------------------
function init(){
UniqRndSeq( 256, display);
document.body.innerHTML = outp.join('');
}
</script>
</head>
<body onload="init();">
</body>
</html>