0 / 0 / 0
Регистрация: 27.03.2016
Сообщений: 33
|
||||||||||||||||
1 | ||||||||||||||||
Когда твой Random совсем не Random20.04.2016, 11:06. Просмотров 2412. Ответов 21
Метки нет Все метки)
(
Мой код ведет себя весьма странно. У меня есть список экземпляров класса в котором (Уж простите что я такое наделал) есть экземпляр другого класса с 4-мя переменными которые рандомятся вместе с созданием экземпляра базового класса.
Прилагаю код. Занесение экземпляров в коллекцию.
0
|
|
20.04.2016, 11:06 | |
Random, повторы при static Random(1 seed) Что не так с 'Random' или There is no overloaded version of 'Random' that can be called with these arguments
Random и объекты класса (pseudo random) |
|
![]() 14836 / 11224 / 2946
Регистрация: 17.09.2011
Сообщений: 18,796
|
||||||
20.04.2016, 11:20 | 4 | |||||
![]() Решение
0
|
1449 / 842 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
|
|
20.04.2016, 11:22 | 5 |
Попробуй поставить между операциями Thread.Sleep(1);
Random действительно не совсем рандом. Это псевдорандом. Он использует время работы системы для расчёта значений. У тебя все операции успевают сработать за один тик времени. А дебаггером ты создаёшь задержку(время успевает протикать).
0
|
0 / 0 / 0
Регистрация: 27.03.2016
Сообщений: 33
|
|
20.04.2016, 11:25 [ТС] | 6 |
nimazzzy, Очень просто
0-й элемент был отлажен.
0
|
0 / 0 / 0
Регистрация: 27.03.2016
Сообщений: 33
|
||||||
20.04.2016, 11:34 [ТС] | 7 | |||||
LeniumSoft, Hkolorotur, а я смотрю на этот код и думаю - "Что же его заставило сделать рандом отдельным полем класса да еще и статическим???"
LeniumSoft, попытка почти удалась. Он делал одинаковыми только по 11 элементов а, дальше у него появлялись новые 11 элементов)
0
|
![]() 8639 / 6100 / 1017
Регистрация: 21.01.2016
Сообщений: 23,018
|
|
20.04.2016, 11:40 | 8 |
Только для инициализации SEED в конструкторе по умолчанию. Последующие вызовы методов Next() это значение меняют и разрешающая способность таймера здесь не причём. Единственное, на что влияет разрешение часов, так это на создаваемые последовательно объекты Random - если между созданием меньше 15 миллисекунд, то такие рандомайзеры будут выдавать одинаковые последовательности.
1
|
1449 / 842 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
|
|
20.04.2016, 11:45 | 9 |
Да. В курсе. Я не заметил цикл сверху у TC. Думал что методы Next выдают одно значение. Буду внимательнее смотреть отныне
![]()
0
|
Master of Orion
![]() |
|
20.04.2016, 12:29 | 10 |
LeniumSoft, как только человек говорит, что у него "неслучайный рандом", не заходя в тему я знаю, что увижу слово new в цикле. Рандом может быть спрятан, еще что-то, то new будет 100%
![]()
2
|
0 / 0 / 0
Регистрация: 27.03.2016
Сообщений: 33
|
|
20.04.2016, 13:08 [ТС] | 11 |
Psilon, похоже что я не первый)
0
|
![]() ![]() |
|
20.04.2016, 14:07 | 12 |
Да, вы не оригинальны. Если сделать поиск по слову Random в форуме, то там ваша проблема вcтречается чуть реже чем везде
![]() Кстати недавно обнаружил у рандома забавный глюк. Если к нему обращаться из нескольких потоков, то рано или поздно возникает ситуация, когда он начинает стабильно генерировать нули ![]()
0
|
![]() 8639 / 6100 / 1017
Регистрация: 21.01.2016
Сообщений: 23,018
|
|
20.04.2016, 14:18 | 13 |
Storm23, это не глюк, об этом прямо сказано в документации. Правда совсем не очевидно, что так должно быть при многопоточном обращении к Random.
0
|
1449 / 842 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
|
|
20.04.2016, 14:25 | 14 |
Там вроде можно статическое поле с Random пометить атрибутом ThreadStatic
0
|
![]() 8639 / 6100 / 1017
Регистрация: 21.01.2016
Сообщений: 23,018
|
|
20.04.2016, 14:29 | 15 |
Ну да. Можно и lock делать. Просто, если к одному объекту Random обращаться из разных потоков, то его так можно и сломать
![]() ![]()
0
|
1449 / 842 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
|
|
20.04.2016, 14:34 | 16 |
Не по теме: Не не. ThreadStatic делает поле индивидуальным для потока. Надо будет только проинициализировать разными значениями сам Random. Не будет межпоточного доступа к экземпляру Random. И ошибки соответственно...
0
|
![]() ![]() |
|
20.04.2016, 14:34 | 17 |
Если у меня высокопроизводительное приложение, то делать lock ради рандома - непозволительная роскошь.
А вот с ThreadStatic - интерснее. Он просаживает скорость работы?
0
|
Master of Orion
![]() |
|||||||||||
20.04.2016, 14:47 | 18 | ||||||||||
Usaga, lock будет блокировать доступ, ThreadStatic просто создаст свой экземпляр для каждого потока. С точки зрения производительности разница разительная.
Обычный Random это примитивный класс с минимумом логики (и следовательно оверхеда). Для сколько-нибудь серьезных приложений используются криптографические рандомайзеры. Тем более, что зачастую нужно не равномерное, а нормальное или еще какое распределение. Их можно и самому сделать, если слегка с теорией ознакомиться, но из коробки и быстрее, и лучше, и надежнее. Короче, рандом - это класс для лабораторок в универе и прототипов на коленке ![]() Добавлено через 1 минуту Storm23, да я выше написал. Довольно полезный атрибут. Например одна из возможных имплементаций с SO:
Правда я бы реализовывал по-другому (с double-check locking легко напутать, например в приведенном выше коде есть баг), например так:
2
|
![]() 8639 / 6100 / 1017
Регистрация: 21.01.2016
Сообщений: 23,018
|
|
20.04.2016, 15:07 | 19 |
Я понимаю разницу между локом и ThreadStatic. Просто имел в виду, что без синхронизации доступа к этому Random обращаться нельзя.
0
|
Тематические курсы и обучение профессиям онлайн Профессия С#-разработчик (Skillbox) Архитектор ПО (Skillbox) Профессия Тестировщик (Skillbox) |
![]() ![]() |
|
20.04.2016, 15:19 | 20 |
Только вы [ThreadStatic] где-то посеяли.
Но меня интересует механизм работы. Похоже оно хранит эту статическую переменную где-то в локальной памяти потока? Есть ли разница во времени доступа к полю с атрибутом ThreadStatic и без этого атрибута?
0
|
20.04.2016, 15:19 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь. Переделать Math.random() в random()
Как узнать когда приходили на твой сайт поисковики Регистация собственного проекта в сети Что делать после того, когда твой проект готов??? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |