Случайность квантовая биномиальная
квантовые случайные qrng.physik.hu-berlin.de/download
qrng.physik.hu-berlin.de/download/sampledata-1MB.bin
qrng.physik.hu-berlin.de/download/sampledata-15MB.bin
Собираются всё про биномиал программы без таблиц и без картинок
Распределенные только 2-чное формула
Случайные с диапазоном 10% тас тэн
и проверка бином около 64000 чисел
Эксцель распределял ли найти таблицу
1-1-0-26.htm
=СЛУЧМЕЖДУ(0;1) =ЕСЛИ(B3=B2;C2+1;0) =СЧЁТЕСЛИ(C$3:C$64100;D2) =СУММ(E2:E10) =E2/E3
Программы бас передел на с# т.к компилятор вин
' 0.bas
OPEN "0.txt" FOR OUTPUT AS #1
FOR s = 1 TO 50000: PRINT #1, (INT(RND * 1000) MOD 2): NEXT
CLOSE
' 1.bas
OPEN "1.txt" FOR OUTPUT AS #1
FOR d = 1 TO 5: FOR s = 1 TO 100
FOR i = 1 TO s: PRINT #1, 1: NEXT
FOR i = 1 TO s: PRINT #1, 0: NEXT
NEXT: NEXT: CLOSE
' 2.bas
OPEN "2.txt" FOR OUTPUT AS #1
FOR k = 1 TO 100: FOR s = 1 TO 7
FOR d = 1 TO 2 ^ (7 - s)
FOR i = 1 TO s: PRINT #1, 1: NEXT
FOR i = 1 TO s: PRINT #1, 0: NEXT
NEXT: NEXT: NEXT: CLOSE
используя программу синтеза случайных
и разделив на малые 0 и большие 1
синтезированы 55000 случайных и проверены
несмотря на нормальность количества подряд 0...7
большее число подряд невозможно
поэтому последовательность хуже обычного rnd
'rndxx.bas
OPEN «rndxxx.txt» FOR OUTPUT AS #1
FOR i = 1 TO 55555: r = Rand
IF r < 0.5 THEN PRINT #1, 0 ELSE PRINT #1, 1
'IF r <= 0.5 THEN PRINT #1, 0 ELSE PRINT #1, 1
'IF r <= 0.7 THEN PRINT #1, 0 ELSE PRINT #1, 1
NEXT: CLOSE
FUNCTION Rand: STATIC Seed
x1 = (Seed * 214013 + 2531011) MOD 2 ^ 24
Seed = x1: Rand = x1 / 2 ^ 24
END FUNCTION
на языке C# случайность тоже маломощная
предполагаю понимаемая людьми как якобы нормальная
using System; // 01.cs
namespace Rextester { public class Program
{ public static void Main(string[] args)
{ Random rand = new Random();
for (int i = 1; i < 5555; i++)
{ var d = rand.Next(2);
if (d<0.5)
Console.WriteLine("0");
else Console.WriteLine("1");
}}}}
rextester.com/WXH62544
Программа peretas.bas создаёт последовательность
случайные a: 0 и 1 алгоритмом ручным из интернета
и программа создаёт случайные d: 0 ... 77777
для перетасовки и сортируя массив d упорядочили массив a
и возможно против повторения лучше тасуемых 1000000
'peretas.bas
DIM a(55555), d(55555)
OPEN "aa.txt" FOR OUTPUT AS #1: OPEN "dd.txt" FOR OUTPUT AS #2
OPEN "aaaa.txt" FOR OUTPUT AS #3: OPEN "dddd.txt" FOR OUTPUT AS #4
FOR i = 1 TO 55555: r = Rand: a(i) = INT(r * 2): PRINT #1, a(i): NEXT
FOR i = 1 TO 55555: r = Rand: d(i) = INT(r * 77777): PRINT #2, d(i): NEXT
FOR i = 1 TO 55554: FOR j = i TO 55555
IF d(i) > d(j) THEN SWAP d(i), d(j): SWAP a(i), a(j)
NEXT: NEXT
FOR i = 1 TO 55555: PRINT #3, a(i): PRINT #4, d(i): NEXT
CLOSE
FUNCTION Rand
STATIC Seed
x1 = (Seed * 214013 + 2531011) MOD 2 ^ 24
Seed = x1
Rand = x1 / 2 ^ 24
END FUNCTION
Теоретические значения в эксцель excel через формулы
=C3/2
=D3+C4
=D4*55000
показывают: из 55000 за 7 шагов охватывается 54570
номеров в своих последовательностях
и вероятно отклонение выдаёт фальшивую случайность
и перетасовав задействовано 54885 близко к теории
using System; namespace Rextester
{ public class Program
{ public static void Main(string[] args)
{ Random rand = new Random();
for (int i = 1; i < 55; i++)
{ double d = rand.Next(2);
Console.WriteLine(Math.Ceiling(d));
}}}}
и расчёты
для вычисления 55000 случайных через онлайн компиляторы
Придуманный мной наобум алгоритм гсч
где используется тригонометрия
'rndsin.bas
OPEN "rndsin.txt" FOR OUTPUT AS #1
c = 0: a = SIN(TIMER) * 100 + 200
PRINT #1, "a= ", a
FOR k = 1 TO 10 ^ 3 + a * 10 ^ 3: NEXT
FOR i = 1 TO 100
FOR j = 1 TO a
x = SIN(TIMER) * 1000 + 2000
b = COS(x): c = c + b
LOCATE 1, 1: PRINT j
NEXT
d = (ABS(c)) - INT(ABS(c))
PRINT #1, d
FOR k = 1 TO 10000 + a * b * c * 10 ^ 2: NEXT
NEXT
проверка показывает распределение плохое
сравнивая чётные\нечётные и малые\большие
зато перетасовка превращает массив в нормальный
я придумал алгоритм Вьюга в школе в прошлом веке
ещё при старом режиме и в нашем веке обнаружил
примерно тоже то же иностранное с названием вихрь
алгоритм вьюга: номер 1-й случайный и прибавляется
случайное приращение и контролируется диапазон
и если нужно контролируется повтор номеров
'VYUGA.bas
DIM a(55555)
RANDOMIZE TIMER: CLS
OPEN "VYUGA.txt" FOR OUTPUT AS #1
d=37
a(1) = INT(RND*d)+1
PRINT #1, a(1)
FOR i = 2 TO 55555
a(i) = a(i-1) + INT(RND*3*d)+1
22 IF a(i) > d THEN a(i) = a(i)-d: GOTO 22
PRINT #1, a(i)
NEXT
ideone.com/cPYZad
using System; // VYUGA.cs
namespace VYUGA { public class Program
{ static double w;
static void Main(string[] args)
{ Random rand = new Random();
int d=37;
double s = rand.Next(5000000);
double a = Math.Round(d*s/5000000)+1;
Console.WriteLine(a);
for (int i = 1; i < 255; i++)
{ w = rand.Next(3000000)+1;
double v = Math.Round(w*d/1000000)+1;
a=a+v;
da: if (a>d)
{ a=a-d; goto da; }
Console.WriteLine(a);}
Console.ReadKey(); }}}
проверка показывает распределение хорошее
сравнивая чётные\нечётные и малые\большие
посему ищу алгоритм вида Мерсенна вихрь
Автоматический алгоритм без rnd считывает массив прямой
и сразу есть массив обратный: ... это же компьютер ...
'tasov.bas
DIM a(55000), d(55000)
OPEN "aa.txt" FOR INPUT AS #1
OPEN "dd.txt" FOR OUTPUT AS #2
FOR i = 1 TO 55000
INPUT #1, a(i): d(55000 - i + 1) = a(i):NEXT
FOR i = 1 TO 54999: FOR j = i TO 55000
IF d(i) > d(j) THEN SWAP d(i), d(j): SWAP a(i), a(j)
NEXT: NEXT
FOR i = 1 TO 55000: PRINT #2, a(i): NEXT: CLOSE
using System; // tasov.cs
using System.Text; using System.IO;
namespace tasov { class Program
{ static long[] a; static long[] d;
static void Main(string[] args)
{ a = new long[55500]; d = new long[55500];
var inpFile = new StreamReader("aa.txt");
for (int i = 1; i <= 55000; i++)
{ a[i] = Convert.ToInt64(inpFile.ReadLine());
d[55000-i+1] = a[i]; }
for (int i = 1; i <= 54999; i++)
for (int j = i; j <= 55000; j++)
if (d[i] > d[j])
{ var temp = d[i]; d[i] = d[j]; d[j] = temp;
temp = a[i]; a[i] = a[j]; a[j] = temp; }
var outFile = new StreamWriter("vv.txt");
for (int i = 1; i <= 55000; i++)
outFile.WriteLine(a[i]);
Console.ReadKey();}}}
Сортировка обратного массива перетасовывает прямой массив
и получается последовательность нормальная
моя программа реализует равное для каждого: excel & basic & c#
я проверяю идею: гсч тригонометрический
создал массив плохой не проходящий проверку
двоичных чётно\нечётных и малые\болшие
поэтому тасуем одинаково реально в эксцель & basic & c#
всего лишь используя данный плохой массив
значит: последовательность слабая
перетасованная через последовательность слабую
превращает в последовательность нормальную
по результатам данной темы
что и требовалось доказать
2014-05-06-18.htm
случайность натуральная: главный спектр повторов
двоичного признака превышает теоретические значения
1/4 = 25% количества признаков или символов
качественная случайность: заполняющая все спектры
двоичного признака согласно теоретическим значениям
натуральная случайность: созданная живыми существами
или природными явлениями ощущаемыми живыми существами
1-1-0-14.htm
Программа распределения случайных на спектры
количества подряд одинаковых признаков
меньше \ больше и чётный \ нечётный
практически логика таблицы excel считает ячейки
следующие зависимо от ячеек предыдущих в столбик
причём массивы важны для записи в файл и особенность
программы: индексы индексов заменяют таблицы excel
'dablip.bas ' начало
RANDOMIZE TIMER ' случайные включило время старта
tb = TIMER: s = 0 ' время старта и сумма = 0
OPEN "zz99.txt" FOR OUTPUT AS #2 ' файл пишет
n = VAL(MID$(TIME$, 7, 2))*10^5 ' случайное количество номеров
DIM b(n), d(n), e(n), f(n) ' массивы b d e f
DIM j(n), k(n), m(n), p(12), q(12) ' массивы j k m p q
LOCATE 1, 1: PRINT " THEORY Average BIG EVEN " ' заголовок на экране
FOR i = 2 TO n-1 ' цикл от 2 до n-1 учитывает 1-й и последний элементы
b(i) = INT(RND*900)+100: s = s+b(i): m = s/i ' b случайное суммируется s и считает среднее m
IF b(i) < m THEN d(i) = 0 ELSE d(i) = 1 ' если число b < среднего m то флаг d=0 иначе 1
IF (b(i) MOD 2) = 0 THEN j(i) = 0 ELSE j(i) = 1 ' если число b чётное то флаг j=0 иначе 1
IF d(i) = d(i-1) THEN e(i) = e(i-1)+1 ELSE e(i) = 0 ' если d одинаковый то счётчик e выше иначе e=0
IF e(i) = 0 THEN f(i) = e(i-1) ELSE f(i) = 12 ' если счётчик e=0 то f равно максимуму иначе f=12
IF f(i) > 12 THEN f(i) = 12 ' максимум f=12
IF j(i) = j(i-1) THEN k(i) = k(i-1)+1 ELSE k(i) = 0 ' если j одинаковый то счётчик k выше иначе k=0
IF k(i) = 0 THEN m(i) = k(i-1) ELSE m(i) = 12 ' если счётчик k=0 то m равно максимуму иначе m=12
IF m(i) > 12 THEN m(i) = 12 ' максимум m=12
p(f(i)) = p(f(i))+1: q(m(i)) = q(m(i))+1 ' счётчики максимумов подряд p и q
IF (i MOD 1000) = 0 THEN LOCATE 3, 1: PRINT i, " from ", n, INT(100*i/n); " %", ' % выполнения
NEXT ' конец цикла
LOCATE 3, 1: FOR t = 1 TO 12 ' место печати и цикл количество строк
PRINT INT(n/(2^(t+1))), INT((p(t-1)+q(t-1))/2), p(t-1), q(t-1) ' печать теории и расчётов
NEXT ' конец цикла
te = TIMER ' переменная время окончания для записи в файл
PRINT: PRINT te-tb; "second", INT(n/(te-tb)); " in second " ' время работы и ячеек в секунду
PRINT n, " elements ", ' количество элементов
PRINT #2, te-tb; "second", INT(n/(te-tb)); " in second " ' в файл время работы и ячеек в секунду
PRINT #2, n, " elements ",: PRINT #2, ' в файл количество элементов
PRINT #2,: PRINT #2, " THEORY Average BIG EVEN ": PRINT #2, ' заголовок в файл
FOR t = 1 TO 12 ' цикл количество строк
PRINT #2, INT(n/(2^(t+1))), INT((p(t-1)+q(t-1))/2), p(t-1), q(t-1) ' в файл печать теории и расчётов
NEXT: END ' конец цикла и финиш
Результаты: Results:
40 second 139555 in second
5600000 elements
THEORY Average BIG EVEN
1400000 1400610 1399595 1401625
700000 700026 700122 699931
350000 349716 349508 349925
175000 174823 174892 174755
87500 87424 87564 87285
43750 43837 43931 43744
21875 22028 21983 22074
10937 10850 10865 10835
5468 5481 5496 5466
2734 2755 2732 2778
1367 1388 1396 1380
687 687 687 687
Практические распределения соответствуют теоретическим
значит случайная последовательность качественная
и возможно изучить паттерны различных последовательностей
Биномиальное Логарифмическое Интегральное Пирамидальное распределение
БЛИП распределение случайных чисел определяет качество ГСЧ и ГПСЧ и КСГПСЧ
Особенность программы: индексы индексов p(f(i)) & q(m(i))
Вариант пишет только на экран в прямом эфире медленнее без индексов индексов
3003 случайных человеческих
228529901523555664468465046804684464644565464557456540456750485080766558855956635656658864665465468854242614548495850865445647569465465949099816873678639022589378257357826984279573971787180438960979023437576655967068666704086044745743444474589690694654042804041133136447654698740869696567503404406406335647758029606960560660860676776344444684569490700421644586206064864413643407659063337586708005566405754650400085454434443545476587570577779597677042080764769487008040366486903978080570568946654646347644574646146146765666604674066465664646756846669477006406744634472445966605758857456346736434448690884544263622163848456039159404756078876646221616115664615869957066068064453362266960644854498449484694044279778126578368394921153645856505606557554455640570445044459078060632554465584576045845045504504545674955455649756045664065840669470066066064654654427554956950666245235254465544765569487408704526264658670670475445663348646955435434349708785575445454596449262255506658226594457574754570470667850475469046700506565344564373657657362129066256464653474865607754545864590758008906365929972095658382382335523856202836562538769387038972072698269207374654864967476047560754452456545494570460467446584644945506975609645645646523669978645236454677263632322355246524516452421545124525544568704587457486645466353664548658457545753627483946554934555644545545346564685543444425534030545465647665668045646543245554654765384654050555464562452144652445584750485945465454543652465347659489646584646676544564889500475466164161466461471472684627557466574654565345545865549674083624628468426394460456465540566437695553224#23254354320505445456455455544546848494805848744445351552325645375$80850960047854865846546354463546658406559467047654065346445584659049654365406584900646705645630665540658655905659405345640558046590765040854087648459459332543564532543674486568456635426653465646556496570065744564256465065408564660040543654675446549574765454644634654365460540565069560686504650546544654659465504654850750754064655056446457476760680795485046584544652464614164642544653465467564557366475644788884435352545456576485565485859987085456636651254405066032543474575875935546459655640765945645454548465485486654865648566846548548944944445545354604356035604645436544765976987080787977566446324626273894040450604409545645656454656354662354546557533755695670047685687868464486459475457497564654766746547653440404038065404754008506504950654055595694075344435465343654654347456746544695670458746546546462634545554265645635486956759486546058496849688959564645442554253641646461646615374654895604584650655655454534343935946594560466464563661164561466726742864645550047574475855586705870587464656949584659456485564563456645347368469048545475456456501104010014415053454647454554846495076549564443457856076856474484796332125326598709798899898998988956564346246365846556687086666235552535455562544677458659707876523236563754849708989922325252553542235465476585455434476876054548984898979786645455435665346563654644363555565754756050665
2022-09-22-85.htm
Угадать число из центра
Программа dafindnum.bas угадывает число без ответа меньше или больше
начав из середины списка и сравнивая раздельно нечётные и чётные
Визуально:
123456789
5
5
5 7
3 5 7
3 5 7 9
1 3 5 7 9
1 3 567 9
1 3 567 9
1 3 56789
1 3456789
1 3456789
123456789
Выиграли если угадали до попытки меньше числа
или проиграли если угадали бы с начала быстрее
Эффективно если распределение угадываемых нормальное волнообразное
однако как оценить результат интеграл пока неизвестно
Однако программа экспериментальная не оптимальная
и возможно включить шаг больше 2
n = 19: Randomize Timer: a = Int(Rnd * (n - 1)) + 1 ' dafindnum.bas
start = Int(1 + n / 2) ' https://qb64phoenix.com/forum/showthread.php?tid=900
Print "n= "; n, "a= "; a: Print: s = 0
For i = 0 To 1: For j = 0 To n / 4
t = Int(start + j * 2) + i
If t > n Then 5
s = s + 1: Print s, t
If t = a Then 25
5 t = Int(start - j * 2) + i
If t < 1 Then 15
s = s + 1: Print s, t
If t = a Then 25
15 Next: Next ': Print "NO...": End
25 Print: Print "Step="; s, "Guess="; a, "Max="; n
If s < a Then Print "WIN" Else If s > a Then Print "Lose" Else Print "Draw"
End
Проверка 1000 или дюжины тысяч показала:
Ничья 25% и Проигрыш 37,5% и Выигрыш 37,5%
n = 3*10^4: start = Int(1 + n / 2) ' dafindnum99.bas
w = 0: l = 0: d = 0 ' Win Lose Draw
For a = 1 To n: s = 0
For i = 0 To 1 ' even \ odd
For j = 0 To n / 4
t = Int(start + j * 2) + i ' right
If t > n Then 5
s = s + 1
If t = a Then 25
5 t = Int(start - j * 2) + i ' left
If t < 1 Then 15
s = s + 1
If t = a Then 25
15 Next: Next ': Print "NO..." : End
25 Print "Max="; n, "Guess="; a, "Step="; s,
If s < a Then Print "WIN": w = w + 1 Else If s > a Then Print "Lose": l = l + 1 Else Print "Draw": d = d + 1
Next a: Print: Print "Win= "; w, "Lose= "; l, "Draw= "; d
End
Значит если ничью считать выигрышем тогда эффективно
Тасовка
тасуем и следим чтоб номер своё место не занял
пока без контроля стал ли массив биномиально лучше
создаём массив номеров подряд
и за 1 проход переставляем номер порядковый и случайный номер
и если номера переставляемых совпадают: крутящаяся строка мой почерк
проверяем массив и если есть номера на своих местах:
считаем количество и пишем массив как бракованный
помечая совпавшие знаком минус
на экран выводятся первые и крайние номера зато в файл возможно писать всё
как копировать текстовые результаты из окна неизвестно поэтому:
картинка показывает: 9 номеров качественно перетасовали с 6-й попытки
за 0 секунд
далее планирую вычислить стала ли последовательность истинно случайной
и видимо придётся перейти на индексы индексов как ячейки excel
вариант: тасовать чтоб каждый элемент переместился дальше 10% от места
ведь длинные массивы наверняка окажутся без повторов
результат видимый если сохранять на диск или рам диск
между ячейками минимум 10%
и количество повторных перетасовок: до 25% длины массива
контроль результата: открыть в блокноте и поиск 1.0
как отношение менее 10% и искомое отсутствует
значит тасуются элементы на расстоянии друг от друга минимум 10% массива
двоичные возникают если выявить чётность и нечётность
и сравнивая относительного среднего: меньше или больше
a = 100: DIM d(a): x=0: k=0: t$=CHR$(9): RANDOMIZE TIMER 'tas_ten.bas
PRINT ,: FOR i = 1 TO a: d(i)=i: NEXT
FOR i = 1 TO 5: PRINT d(i);: NEXT: PRINT ,
FOR i = a-3 TO a: PRINT d(i);: NEXT: z = TIMER
OPEN "b:/control.txt" FOR OUTPUT AS #1 ' ram disk
WHILE x < 1
v = 0: FOR i = 1 TO a
1 m = INT(RND*a)+1: IF ABS(d(i)-d(m)) < .1*a THEN v = v+1: GOTO 1
PRINT #1, ABS(d(i)-d(m)); t$; d(i); t$; d(m); t$; i; t$; m; t$; d(i)/d(m); t$; d(m)/d(i)
t = d(i): d(i) = d(m): d(m) = t
NEXT
s = 0: FOR i = 1 TO a
IF d(i) = i THEN s = s+1
NEXT
5 k = k+1: PRINT: PRINT s; v,: IF s=0 THEN x = x+1
FOR i = 1 TO 5
IF d(i) = i THEN PRINT -d(i); ELSE PRINT d(i);
NEXT: PRINT ,
FOR i = a-3 TO a
IF d(i) = i THEN PRINT -d(i); ELSE PRINT d(i);
NEXT
WEND: PRINT: PRINT " = "; k, TIMER-z: END
ABS d(i) d(m) i m d(i)/d(m) d(m)/d(i)
41 70 29 91 18 2.413793 0.4142857
59 24 83 92 38 0.2891566 3.458333
14 32 46 93 44 0.6956522 1.4375
23 10 33 94 88 0.3030303 3.3
29 19 48 95 36 0.3958333 2.526316
11 41 30 96 11 1.366667 0.7317073
38 1 39 97 21 2.564103E-02 39
60 26 86 98 55 0.3023256 3.307692
17 4 21 99 58 0.1904762 5.25
26 100 74 100 59 1.351351 0.74
Думаю данная моя давнишняя разработка
поможет синтезировать качественные случайные
Количество совпадений подряд рассчитывает формула N=log(1-C)/log(1-P),
где N – шаг, P – вероятность, C – надёжность вероятности.
Подставив C и P: N=log(1-0,99)/log(1-0,5) = 6,7 = натуральное значение 7,
значит по счёту 7-й шаг распределения должен включать около 1% от половины данных, из-за подсчёта повторов и 0 и 1, в сумме 100%.
Номер шага распределения:
при С=P=0,5; N = 1 = log0,5/log0,5 = log(1-1/2)/log(1-1/2) = 1
при C=0,25; P=0,5; N = 2 = log0,75/log0,5 = log(1-1/4)/log(1-1/2) = 2 и т.д.
25000 zip 5 KB = 25'000 (0\1)
https://qb64forum.alephc.xyz/index.php?action=dlattach;topic=4473.0;attach=17658
откуда и сделать 65000
отклонение от теории в % |