Заговор генераторов случайных чисел
Вставка
- Опубліковано 29 чер 2017
- В этом выпуске экстремальных фишек мы с вами узнаем почему Random в .NET Framework нифига не Random, а так же много других интересных вещей
Reference Source: github.com/Microsoft/referenc...
.NET Core Random: github.com/dotnet/coreclr/blo...
Прочие полезные ссылки:
● VK: bit.ly/vk_extremecodetv
● Telegram Chat: bit.ly/telegram_extremecodetv
● iTunes: bit.ly/itunes_extremecodetv
● Twitter: bit.ly/twitter_extremecodetv
● GitHub: bit.ly/github_extremecodetv
Код работал на 20-66 MHz процессоре. За вашим космолетом не успевает.
Это потому, что 31 обладает хорошим свойством - его умножение можно заменить битовым сдвигом, который быстрее стандартного умножения:
31 * i == (i
А почему у Кнута было 21? D:
Подожди, подожди ты хочешь сказать что чел, блять, три недели изучал какую то там книгу, какого чувака (сорри если это важная книга важного чувака) для того чтобы ты пришёл и оставил коммент и ответил на вопрос, лол. (не знаю почему но это кажется очень смешным.)
@@ExtremeCode bruh, 3:33
Чел, ты этим сдвигом на 32 умножишь
@@user-bj1sl4fi8w ну так он вычитает i
Я сексуальная брюнетка с 3 размером груди.... лойс за разследование и Кнута в часности
Интерсно, годно, даёшь ещё
тоже иногда палю как random с каждым запуском выдает одни и те же комбинации... лезть в него я конечно не буду))
Всё заебись, но звук бы погромче
У тебя есть кнопки на телефоне! Сделай звук громче ими!
они рандомны относительно своей последовательности, остальное твои проблемы :)
2 варианта решения проблемы:
1. Заставит вашу программу немного затормозить. После вывода каждого рандомного числа делаем Thread.Sleep(7); Почему 7? Нечетное число после которго нельзя будет проследить последовательность генерации чисел, но можно и 13 и любые другие числа выше 1 (иначе будут генериться просто последовательные числы). Работает за счет того, что мы заставляем процесс уснуть на 7мс, что позволяет сгенерировать новое рандомное число опираясь на тайминги.
2. Сделать конструкцию new Random(i).Next(); - работает потому что как сид вместо времени мы подпихиваем кастомные числа.
Nice try. Только на 7ms не усыпишь поток, ибо «system clock resolution”.
Такая же проблема есть с генерацией неуникальных guid если их в цикле создавать. Для этого в winApi сделали специальную функцию, через которую запрашиваешь необходимое кол-во гуидов, которые надо сгенерить. Вангую, что в дотнете тоже есть метод, который генерит массив криптостойких рандомов, скорее всего надо искать в крипто неймспейсе.
Короче, не нужно рандом в цикле теребонькать.
using Troschuetz.Random; вот норм генератор
int temp = new TRandom(new NR3Generator()).Next(100); вообще топчик
Проблема в том что используется объект new Random внутри цикла for а если его вынести то все будет генерировать случайным
Ну 1 раз из миллиона понадобится сгенерировать случайное число внутри набора объектов, которые получают значения каких-то свойств случайным образом во время инициализации, но этого не поизойдёт по причине сабжа и настанет апокалипсис
Умники, которые говорят что-то вроде этого "Там ко-ко-ко надо было ко-ко инициализировать до цикла ко". Автор показывает, сам алгоритм, и то чтобы вы не напоролись на этот кол, когда подумаете решить через new Random().Next()
хз. У меня, даже если я инициализировал "До", работало так же хуево
Снимаю шляпу, господа
2.38 отсылочка топ
возможно правильнее использовать Random random = new Random(); вне (до)цикла итераций чтобы объект класса Random не создавался по одному и тому же значению времени что и дает по идее одинаковые выводы .Next();
это понятно, но вопрос не в этом
йоу, а в чем конкретно?
почему происходит то что происходит, попытка понять в чем магия, почему рендом класс при инициализации в цикле выдает одинаковые числа(рандом же должен быть)
я запросто могу ошибаться, но - при инициализации класса единственная случайная переменная из которой потом математически выводятся новые псевдослучайные числа - это время жизни пк с последнего запуска.(или около того) современные пк работают настолько быстро, что итерации цикла в котором есть и new и потом .next а потом заново - происходит условно мгновенно. таким образом эта единственная случайная переменная всегда одинаковая, а все что происходит дальше, это чистая математика которая опирается на эту переменную. а переменная(которая зависит от времени)- одна и та же. она еще не успела изменится, пк работает быстро. поэтому и вывод цикла одинаковый.
Mikee Tankovsky
Собственно, автор ролика о том же. Но так практически все(а может и вообще все) цифровые генераторы работают, они все псевдогенераторы.Настоящий генератор можно сделать только аналоговым.
Что бы сгенерировать рандомные числа, достаточно спросить у либеральных экономистов сколько будет стоить бакс завтра. Ну или если серьёзно, то почему бы не использовать шум интернета или поставить антенну в процессор, которая будет чувствительно воспринимать шум радио сигналов или даже электричества, или ловить шум фоновой радиации, фотонов и прочего электромагнитного излучения
Дружище, ты инициализируешь класс одним и тем же значением, а именно меткой времени с точностью до мс. Странно было бы ожидать другого результата
4 8 15 16 23 42
Что это?
@@andreyandrey2223 4 8 15 16 23 42
@@pnt7791 Чё?
@@andreyandrey2223 Милый Андрей, погуглите :)
Lost!!
Ответ на главный вопрос жизни, вселенной и всего такого
По факту проблема начального значения, и не в чём ином, ибо генератор псевдослучайных чисел.
Решение проблемы повтора с System.Random:
1. Использование экземпляра вне цикла.
2. Передача параметра (System.Int32) System.DateTime.Now.Ticks (или другого, что будет обновляться быстрее выполняемой операции)
3. Применить другой алгоритм генерации.
Если вопрос актуален.
Сделайте переменную рандома статическим
3 года прошло... Это прям сильно, мучится от рандома три года
Братюни спасибо за видео, поделюсь наблюдениями ... ВАЖНО !!!
люблю делать автозаполнение объектов для тестирования, имена / числа / etc...
числа генерируються с упором на время, лучше всего для объяснения подходит C++ по тому что я его немного знаю
в функции rand() не знаю каким образом есть генератор ОДИНАКОВЫХ чисел со входящим параметром - что это значит ? если мы пишем for (i=0; i< x3 ;i++) rand(i)
у нас будут светиться одинаковая последовательность чисел, для большей рандомизации чисел придумали srand(time(nullptr)); при наличии функции rand() в поле видимости srand(time(nullptr)) в функцию rand(x) передаётся время вплоть до Милисекунд*(текущее время), в секунде по принципам математики 100 МилиСекунд,
так вот ... есть функция sleep(1000) которая делает простой программы в месте её написания, из расчёта что 1000 = 1 секунда, что б сделать полный рандом нужно между генератором случайных чисел поставить sleep(11) !!! 11 - не меньше, по тому что 10 ещё не заходит на первую милисикунду*(тестил) так что при написании кода у вас будет полный рандом ... пример:
#include // for time(nullptr)
#include
#include // for Sleep(11);
using namespace std;
int main()
{
std:srand(time(nullptr));
for (int i = 0; i < 100; i++)
{
Sleep(11); // Thread.Sleep(); // for C#
std::cout
+ Sleep(11); нужно прописывать в конструкторах объектов если нужен рандом ...
нраааица
А если с рандомом использовать такую конструкцию:
int[] mas = new int[1000];
mas[0] = new Random().Next();
for (int j = 1; j < 1000; j++)
{
mas[j] = new Random().Next();
while(mas[j].Equals(mas[j - 1]))
{
mas[j] = new Random().Next();
}
}
ето будет не правильно?)
п.с. для генерации 1000 рандомных чисел
var random = new Random();
for(int i = 0; i < 1000; i++){
cw(random.Next());
}
а что за метод "cw"?
volstep seredyuk Console.WriteLine();
Спасибо за ответ)
это код с текущего проджекта ленивца, не обращай внимание
Видео: *научное*
Я: *научный*
ExtremeCode: Так б@$$* что за x^%%^
И это всё??? А где ответ на главную загадку? 3:33 Что за 31 и почему 31? Как спать теперь то..
Это тебе не баши баратрума счетать.
Недавно такое произошло со мной. Я подумал, что сломал компьютер... 😮
потому что singleton
Может тогда лучше брать не время от запуска системы, а значение дата-время с максимальной точностью, тогда это точно не будет повторяться.
Просто оставлю это здесь:
var rnd = new Random();
for (int i = 0; i < 10; i++)
Console.WriteLine(rnd.Next());
Спасибо!
в лото настоящий рандом
Ха а через компилятор на сайте майкрософта такой проблемы нет ) Все из-за модификатора [ThreadStatic] поля
private static Random t_threadRandom;
private static readonly Random s_globalRandom = new Random(GenerateGlobalSeed());
не обновляются, поэтому генерируются одинаковые последовательности
Равноценно new Random(int a).Next(); Где вместо а можно подставлять любое целое число и будет генерироваться из него последовательность одинаковых чисел.
Как - то так.
Этот косяк пофиксили давным-давно, с какой-то ревизией .NET Core , так что не актуально уже :)
я оруууу)))))))))))) соскучился по вашим видосам))
//замечу что тут написано, что 31 - очень важное число))) ахаххаха
Очень познавательно и полезно - правда них... не понял =)
Теперь для маленьких и тупых - запили свой рандомайзер процедуру( функцию) или как ты там хочешь назвать её =) покажи и разбери как он работает.
Еще случайно обнаружил что Random если указать промежуток выдачи чисел от -х до х выдает 70% отрицательных чисел. Протестил это на ооочень большем объеме чисел. Может кто знает в чем тут дело?
а на JS который все так хэйтят проблемы то нет!)
Всё дело в семячке ;) чекните реализацию rand & srand - СИшные функции
Здесь собрались программисты бизнес-решений. А вы им про задающие числа псевдослучайных последовательностей....
42
Там должно быть не 21, не 31, а 42!
Правильное использование System.Random :
System.Random r = new System.Random();
for (int i = 0; i < 10; i++)
{
print(r.Next());
}
и будет Вам счастье.
А если рандом используется внутри класса и не может быть вынесен вовне? Что тогда делать случайно инициализируемым полям?
Можно юзать Thread.Sleep(10) перед каждой генерацией, я таким костылем во всех лабах подпирал)
ну это совсем пиздец)
@@user-nl9oc9rp1h согласен
Только что запустил єтот код и вышли разные числа
Потому что нужно писать так:
var rnd = new Random();
for (int i = 0; i < 10; i++)
WriteLine(rnd.Next());
ReadKey();
Рандома в компьютерах не бывает xD
Бывает, в линукс /dev/random например. Ну и для совсем абсолютно непредсказуемого рандома есть специальные коробочки, которые подключаются по юсб и генерируют числа на основе квантовых шумов.
Я тебе больше скажу, настоящего рандома нигде не бывает.
Хотя вроде-бы в квантовой физике есть что-то такое, но я слишком маленький и тупой для такого.
@@vatyunga квантовофизический рандом будет рандомом, но ровно до того момента как не найдут эксплойт
Что бы знали. Не существует реальных способов получить рандомное число, все они базируются на чем-то. От времени, до количества напряжения в вашом пукане. Тогда придумали псевдогенераторы алгоритмические. Они тоже псевдо, но уже без зависимости на что-то (время\воздух\сила тока), но они так-же не детерминированные. Все они имеют такие числа как ты написал (это прирост, дефолтное значение, максимальное, и мультиплаер).
Ну да, это очевидно и понятно, разве не так? Вопрос то в задаче был о другом.
Вот же вам заняться нечем XD
мб singleton?
Если шо - на 15 мая 2022 такой проблемы не наблюдается)
П.С. это в .Net 6 проблем нет. в .Net Framework действительно вот такая хрень имеется...
У меня нормально создает числа
хоть бы посмотрел еще в другую сторону - /dev/random
А представляешь, в драйвере new Random() увидеть...
Random rand1 = new Random((int)(DateTime.Now.Ticks));
for (int i = 0; i < 10; i++)
{
Console.WriteLine(rand1.Next(20));
}
чуваки, это конечно интересно. но я считаю, что такие видосы надо выкладывать, когда у вас уже всё обо всём рассказано и показано. хотя хз. может быть я не прав
CLR быстро сожрал код. Добавляйте в for что-то типа Thread.Sleep(150)и получайте свой рандом
Это не решение а костыль.