Заговор генераторов случайных чисел

Поділитися
Вставка
  • Опубліковано 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

КОМЕНТАРІ • 109

  • @stl4521
    @stl4521 7 років тому +135

    Код работал на 20-66 MHz процессоре. За вашим космолетом не успевает.

  • @Qnoize
    @Qnoize 4 роки тому +91

    Это потому, что 31 обладает хорошим свойством - его умножение можно заменить битовым сдвигом, который быстрее стандартного умножения:
    31 * i == (i

    • @ExtremeCode
      @ExtremeCode  4 роки тому +18

      А почему у Кнута было 21? D:

    • @s1mon878
      @s1mon878 3 роки тому +28

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

    • @SoundsOfLimbo
      @SoundsOfLimbo 3 роки тому +8

      @@ExtremeCode bruh, 3:33

    • @user-bj1sl4fi8w
      @user-bj1sl4fi8w 3 роки тому +1

      Чел, ты этим сдвигом на 32 умножишь

    • @noki9930
      @noki9930 3 роки тому +3

      @@user-bj1sl4fi8w ну так он вычитает i

  • @flachy7
    @flachy7 7 років тому +38

    Я сексуальная брюнетка с 3 размером груди.... лойс за разследование и Кнута в часности

  • @grafgeleon2420
    @grafgeleon2420 6 років тому

    Интерсно, годно, даёшь ещё

  • @user-ly2jd8yo6e
    @user-ly2jd8yo6e 7 років тому +15

    тоже иногда палю как random с каждым запуском выдает одни и те же комбинации... лезть в него я конечно не буду))

  • @user-cv8sl4hs2o
    @user-cv8sl4hs2o 7 років тому +33

    Всё заебись, но звук бы погромче

    • @user-kv5fw7xz9c
      @user-kv5fw7xz9c 3 роки тому +1

      У тебя есть кнопки на телефоне! Сделай звук громче ими!

  • @konstantingeist3587
    @konstantingeist3587 6 років тому +12

    они рандомны относительно своей последовательности, остальное твои проблемы :)

  • @minty6989
    @minty6989 3 роки тому +2

    2 варианта решения проблемы:
    1. Заставит вашу программу немного затормозить. После вывода каждого рандомного числа делаем Thread.Sleep(7); Почему 7? Нечетное число после которго нельзя будет проследить последовательность генерации чисел, но можно и 13 и любые другие числа выше 1 (иначе будут генериться просто последовательные числы). Работает за счет того, что мы заставляем процесс уснуть на 7мс, что позволяет сгенерировать новое рандомное число опираясь на тайминги.
    2. Сделать конструкцию new Random(i).Next(); - работает потому что как сид вместо времени мы подпихиваем кастомные числа.

    • @Rustamushko
      @Rustamushko Рік тому

      Nice try. Только на 7ms не усыпишь поток, ибо «system clock resolution”.

  • @Rustamushko
    @Rustamushko Рік тому +1

    Такая же проблема есть с генерацией неуникальных guid если их в цикле создавать. Для этого в winApi сделали специальную функцию, через которую запрашиваешь необходимое кол-во гуидов, которые надо сгенерить. Вангую, что в дотнете тоже есть метод, который генерит массив криптостойких рандомов, скорее всего надо искать в крипто неймспейсе.
    Короче, не нужно рандом в цикле теребонькать.

  • @miker5879
    @miker5879 6 років тому +1

    using Troschuetz.Random; вот норм генератор
    int temp = new TRandom(new NR3Generator()).Next(100); вообще топчик

  • @DixStore
    @DixStore 6 років тому +15

    Проблема в том что используется объект new Random внутри цикла for а если его вынести то все будет генерировать случайным

    • @IvanAndreev91
      @IvanAndreev91 3 роки тому +4

      Ну 1 раз из миллиона понадобится сгенерировать случайное число внутри набора объектов, которые получают значения каких-то свойств случайным образом во время инициализации, но этого не поизойдёт по причине сабжа и настанет апокалипсис

  • @user-cc1hn8dv8x
    @user-cc1hn8dv8x 6 років тому +15

    Умники, которые говорят что-то вроде этого "Там ко-ко-ко надо было ко-ко инициализировать до цикла ко". Автор показывает, сам алгоритм, и то чтобы вы не напоролись на этот кол, когда подумаете решить через new Random().Next()

    • @paschanchik
      @paschanchik 6 років тому +1

      хз. У меня, даже если я инициализировал "До", работало так же хуево

  • @user-dx9mp2en9c
    @user-dx9mp2en9c 7 років тому +2

    Снимаю шляпу, господа

  • @mortimersmith359
    @mortimersmith359 4 роки тому

    2.38 отсылочка топ

  • @mikeefpv
    @mikeefpv 7 років тому +27

    возможно правильнее использовать Random random = new Random(); вне (до)цикла итераций чтобы объект класса Random не создавался по одному и тому же значению времени что и дает по идее одинаковые выводы .Next();

    • @MrFrimko
      @MrFrimko 6 років тому +5

      это понятно, но вопрос не в этом

    • @mikeefpv
      @mikeefpv 6 років тому

      йоу, а в чем конкретно?

    • @MrFrimko
      @MrFrimko 6 років тому +1

      почему происходит то что происходит, попытка понять в чем магия, почему рендом класс при инициализации в цикле выдает одинаковые числа(рандом же должен быть)

    • @mikeefpv
      @mikeefpv 6 років тому +20

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

    • @AlexCSharp
      @AlexCSharp 5 років тому +5

      Mikee Tankovsky
      Собственно, автор ролика о том же. Но так практически все(а может и вообще все) цифровые генераторы работают, они все псевдогенераторы.Настоящий генератор можно сделать только аналоговым.

  • @LLlblKAPHO
    @LLlblKAPHO Рік тому +1

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

  • @soltaurus
    @soltaurus 3 роки тому +10

    Дружище, ты инициализируешь класс одним и тем же значением, а именно меткой времени с точностью до мс. Странно было бы ожидать другого результата

  • @pnt7791
    @pnt7791 6 років тому +27

    4 8 15 16 23 42

  • @fartuna777
    @fartuna777 3 роки тому +1

    Ответ на главный вопрос жизни, вселенной и всего такого

  • @musikuma8424
    @musikuma8424 4 роки тому +1

    По факту проблема начального значения, и не в чём ином, ибо генератор псевдослучайных чисел.
    Решение проблемы повтора с System.Random:
    1. Использование экземпляра вне цикла.
    2. Передача параметра (System.Int32) System.DateTime.Now.Ticks (или другого, что будет обновляться быстрее выполняемой операции)
    3. Применить другой алгоритм генерации.

  • @fvrcbv1558
    @fvrcbv1558 4 роки тому +2

    Если вопрос актуален.
    Сделайте переменную рандома статическим

    • @h_it
      @h_it 2 роки тому +3

      3 года прошло... Это прям сильно, мучится от рандома три года

  • @Buarpa
    @Buarpa 4 роки тому +1

    Братюни спасибо за видео, поделюсь наблюдениями ... ВАЖНО !!!
    люблю делать автозаполнение объектов для тестирования, имена / числа / 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

    • @Buarpa
      @Buarpa 4 роки тому

      + Sleep(11); нужно прописывать в конструкторах объектов если нужен рандом ...

  • @user-xy9yi7pm8i
    @user-xy9yi7pm8i 7 років тому

    нраааица

  • @user-ij1vt2bm1x
    @user-ij1vt2bm1x 7 років тому +3

    А если с рандомом использовать такую конструкцию:
    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 рандомных чисел

    • @ExtremeCode
      @ExtremeCode  7 років тому +7

      var random = new Random();
      for(int i = 0; i < 1000; i++){
      cw(random.Next());
      }

    • @user-ij1vt2bm1x
      @user-ij1vt2bm1x 7 років тому +1

      а что за метод "cw"?

    • @mikeefpv
      @mikeefpv 7 років тому +1

      volstep seredyuk Console.WriteLine();

    • @user-ij1vt2bm1x
      @user-ij1vt2bm1x 7 років тому

      Спасибо за ответ)

    • @flachy7
      @flachy7 7 років тому

      это код с текущего проджекта ленивца, не обращай внимание

  • @ohnocoder
    @ohnocoder 2 роки тому

    Видео: *научное*
    Я: *научный*
    ExtremeCode: Так б@$$* что за x^%%^

  • @nick-test
    @nick-test 3 роки тому +1

    И это всё??? А где ответ на главную загадку? 3:33 Что за 31 и почему 31? Как спать теперь то..

  • @Tropen91
    @Tropen91 4 роки тому +1

    Это тебе не баши баратрума счетать.

  • @FalyonkiGuy
    @FalyonkiGuy 4 роки тому

    Недавно такое произошло со мной. Я подумал, что сломал компьютер... 😮

  • @dsstepanov
    @dsstepanov 6 років тому +2

    потому что singleton

  • @anreechase8020
    @anreechase8020 Рік тому

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

  • @rbogdan8980
    @rbogdan8980 7 років тому +9

    Просто оставлю это здесь:
    var rnd = new Random();
    for (int i = 0; i < 10; i++)
    Console.WriteLine(rnd.Next());

  • @andrusia2048
    @andrusia2048 2 роки тому

    в лото настоящий рандом

  • @user-yx5mb4sz9t
    @user-yx5mb4sz9t 4 роки тому

    Ха а через компилятор на сайте майкрософта такой проблемы нет ) Все из-за модификатора [ThreadStatic] поля
    private static Random t_threadRandom;
    private static readonly Random s_globalRandom = new Random(GenerateGlobalSeed());
    не обновляются, поэтому генерируются одинаковые последовательности
    Равноценно new Random(int a).Next(); Где вместо а можно подставлять любое целое число и будет генерироваться из него последовательность одинаковых чисел.
    Как - то так.

    • @ExtremeCode
      @ExtremeCode  4 роки тому

      Этот косяк пофиксили давным-давно, с какой-то ревизией .NET Core , так что не актуально уже :)

  • @oganovdavid
    @oganovdavid 7 років тому +8

    я оруууу)))))))))))) соскучился по вашим видосам))
    //замечу что тут написано, что 31 - очень важное число))) ахаххаха

  • @TheKOTLUIS
    @TheKOTLUIS 5 років тому

    Очень познавательно и полезно - правда них... не понял =)
    Теперь для маленьких и тупых - запили свой рандомайзер процедуру( функцию) или как ты там хочешь назвать её =) покажи и разбери как он работает.

  • @daimirmus
    @daimirmus 9 місяців тому

    Еще случайно обнаружил что Random если указать промежуток выдачи чисел от -х до х выдает 70% отрицательных чисел. Протестил это на ооочень большем объеме чисел. Может кто знает в чем тут дело?

  • @StepanVorobiov
    @StepanVorobiov 3 роки тому

    а на JS который все так хэйтят проблемы то нет!)

  • @salten13
    @salten13 6 років тому

    Всё дело в семячке ;) чекните реализацию rand & srand - СИшные функции

    • @sergey_fetisov
      @sergey_fetisov 3 роки тому

      Здесь собрались программисты бизнес-решений. А вы им про задающие числа псевдослучайных последовательностей....

  • @Avteon
    @Avteon 3 роки тому +1

    42

  • @Ais_Hunt
    @Ais_Hunt Рік тому +1

    Там должно быть не 21, не 31, а 42!

  • @user-tm6yc5gv3n
    @user-tm6yc5gv3n 3 роки тому +3

    Правильное использование System.Random :
    System.Random r = new System.Random();
    for (int i = 0; i < 10; i++)
    {
    print(r.Next());
    }
    и будет Вам счастье.

    • @IvanAndreev91
      @IvanAndreev91 3 роки тому

      А если рандом используется внутри класса и не может быть вынесен вовне? Что тогда делать случайно инициализируемым полям?

  • @klasterdev154
    @klasterdev154 7 років тому +3

    Можно юзать Thread.Sleep(10) перед каждой генерацией, я таким костылем во всех лабах подпирал)

    • @user-nl9oc9rp1h
      @user-nl9oc9rp1h 6 років тому +25

      ну это совсем пиздец)

    • @magictime8959
      @magictime8959 3 роки тому

      @@user-nl9oc9rp1h согласен

  • @user-sd6pz7us7z
    @user-sd6pz7us7z Рік тому

    Только что запустил єтот код и вышли разные числа

  • @samesadface
    @samesadface 7 років тому +13

    Потому что нужно писать так:
    var rnd = new Random();
    for (int i = 0; i < 10; i++)
    WriteLine(rnd.Next());
    ReadKey();

  • @user-wd3tk1jg8p
    @user-wd3tk1jg8p 7 років тому

    Рандома в компьютерах не бывает xD

    • @mk72v2oq
      @mk72v2oq 7 років тому +8

      Бывает, в линукс /dev/random например. Ну и для совсем абсолютно непредсказуемого рандома есть специальные коробочки, которые подключаются по юсб и генерируют числа на основе квантовых шумов.

    • @vatyunga
      @vatyunga 6 років тому +4

      Я тебе больше скажу, настоящего рандома нигде не бывает.
      Хотя вроде-бы в квантовой физике есть что-то такое, но я слишком маленький и тупой для такого.

    • @Pchelozavr
      @Pchelozavr 4 роки тому +3

      @@vatyunga квантовофизический рандом будет рандомом, но ровно до того момента как не найдут эксплойт

  • @oleksii5138
    @oleksii5138 5 років тому +3

    Что бы знали. Не существует реальных способов получить рандомное число, все они базируются на чем-то. От времени, до количества напряжения в вашом пукане. Тогда придумали псевдогенераторы алгоритмические. Они тоже псевдо, но уже без зависимости на что-то (время\воздух\сила тока), но они так-же не детерминированные. Все они имеют такие числа как ты написал (это прирост, дефолтное значение, максимальное, и мультиплаер).

    • @Chakaramba
      @Chakaramba 5 років тому +1

      Ну да, это очевидно и понятно, разве не так? Вопрос то в задаче был о другом.

  • @Daniyar86
    @Daniyar86 7 років тому +2

    Вот же вам заняться нечем XD

  • @miker5879
    @miker5879 6 років тому

    мб singleton?

  • @user-jg4ee5sv1d
    @user-jg4ee5sv1d 2 роки тому

    Если шо - на 15 мая 2022 такой проблемы не наблюдается)

    • @user-jg4ee5sv1d
      @user-jg4ee5sv1d 2 роки тому

      П.С. это в .Net 6 проблем нет. в .Net Framework действительно вот такая хрень имеется...

  • @user-rd1ok9rl7w
    @user-rd1ok9rl7w 2 роки тому

    У меня нормально создает числа

  • @gnosov
    @gnosov 4 роки тому

    хоть бы посмотрел еще в другую сторону - /dev/random

    • @sergey_fetisov
      @sergey_fetisov 3 роки тому +1

      А представляешь, в драйвере new Random() увидеть...

  • @pinkmane1337
    @pinkmane1337 5 років тому +3

    Random rand1 = new Random((int)(DateTime.Now.Ticks));
    for (int i = 0; i < 10; i++)
    {
    Console.WriteLine(rand1.Next(20));
    }

  • @user-sq7bm3of3m
    @user-sq7bm3of3m 7 років тому

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

  • @Tinyismyson
    @Tinyismyson 6 років тому

    CLR быстро сожрал код. Добавляйте в for что-то типа Thread.Sleep(150)и получайте свой рандом

    • @shadowzyxi758
      @shadowzyxi758 4 роки тому +2

      Это не решение а костыль.