| Полный Random() (C#) |
| E][pert | Дата: Вторник, 05.04.2011, 13:36 | Сообщение # 1 |
C#-XNA-Unity
Сообщений: 423
Сейчас нет на сайте
| Как в C# добиться результата полной случайности функции Random()?
Нажми на мою подпись, попади в мой блог. Помогаю по мере возможностей, учусь по мере сил. ©E}{pert
|
| |
| | |
| noTformaT | Дата: Вторник, 05.04.2011, 13:44 | Сообщение # 2 |
Ukrainian independent game developer
Сообщений: 3618
Сейчас нет на сайте
| Quote (E||pert) Как в C# добиться результата полной случайности функции Random()? это как? там вроде бы алгоритм генерирует число в диапазоне 0.0f..1.0f. Что в этом алгоритме не так?
@noTformaT Блог разработчика игр: PythonAnywhere! Пишите на Python везде. РЕЛИЗ. Glow Web. [2d][flash] РЕЛИЗ. Flow Orb. [2d][flash]
|
| |
| | |
| zodiak | Дата: Вторник, 05.04.2011, 14:08 | Сообщение # 3 |
участник
Сообщений: 226
Сейчас нет на сайте
| Он и так полностью случайный. Если не передавать конструктору никакого значения, он инициализируется текущим временем, и выдает абсолютно "случайный" результат. Code Random rnd = new Random();
Точка зору окремо взятого індивіда завжди суб'єктивна!
C++/C# программист. Ищу команду.
|
| |
| | |
| E][pert | Дата: Вторник, 05.04.2011, 14:09 | Сообщение # 4 |
C#-XNA-Unity
Сообщений: 423
Сейчас нет на сайте
| noTformaT, я немножко не так вопрос поставил. При запуске игры каждый раз отображается та же последовательность чисел.
Нажми на мою подпись, попади в мой блог. Помогаю по мере возможностей, учусь по мере сил. ©E}{pert
|
| |
| | |
| TimKruz | Дата: Вторник, 05.04.2011, 14:22 | Сообщение # 5 |
старожил
Сообщений: 1588
Сейчас нет на сайте
| E][pert, нужно инициализировать функцию random с помощью другой процедуры/функции (типа randomize в Delphi), тем самым меняя алгоритм генерации чисел. Поищи в интернете, эти две функции должны в связке в любом уроке/статье идти... Отображается одна последовательность чисел потому, что на самом деле ни каких случайностей нет и быть не может. Число выбирается в соответствии с одной из функций, которую, в свою очередь, нужно сменить другой функцией. Но слишком часто это делать не следует, чтобы не терять время. Однако периодически числа будут повторяться, тогда надо сменить алгоритм повторной инициализацией...
Сообщение отредактировал TimKruz - Вторник, 05.04.2011, 14:26 |
| |
| | |
| Kefir87 | Дата: Вторник, 05.04.2011, 14:25 | Сообщение # 6 |
|
участник
Сообщений: 129
Сейчас нет на сайте
| Quote (zodiak) Он и так полностью случайны Он дает псевдослучайные числа. Чтобы получить действительно случайные числа, нужно отталкиваться от времени. Code Код на Pascal z:=(y/m+d*h) mod sec;
|
| |
| | |
| TimKruz | Дата: Вторник, 05.04.2011, 14:31 | Сообщение # 7 |
старожил
Сообщений: 1588
Сейчас нет на сайте
| Kefir87, алгоритмов может быть очень много, но он спрашивает про метод random. Твой алгоритм не для всех случаев подойдёт, он сложен. А если, например, надо получить одно из двух или четырёх чисел, при этом с возможностью настроить частоту получения каждого числа?.. Ну и т.д., и т.п.
|
| |
| | |
| Kefir87 | Дата: Вторник, 05.04.2011, 14:32 | Сообщение # 8 |
|
участник
Сообщений: 129
Сейчас нет на сайте
| Quote (TimKruz) А если, например, надо получить одно из двух или четырёх чисел, при этом с возможностью настроить частоту получения каждого числа?.. Ну и т.д., и т.п Где-то у меня была книга по вышке, там все очень хорошо описаны все алгоритмы, если найду, напишу автора
|
| |
| | |
| E][pert | Дата: Вторник, 05.04.2011, 14:41 | Сообщение # 9 |
C#-XNA-Unity
Сообщений: 423
Сейчас нет на сайте
| TimKruz, у мня в книге подобный пример на С есть но на C# подобного не видел :(. Kefir87, сейчас поэкспериментирую.Добавлено (05.04.2011, 14:41) --------------------------------------------- Не удается мне временем повлиять на рандом.
Нажми на мою подпись, попади в мой блог. Помогаю по мере возможностей, учусь по мере сил. ©E}{pert
|
| |
| | |
| TimKruz | Дата: Вторник, 05.04.2011, 14:45 | Сообщение # 10 |
старожил
Сообщений: 1588
Сейчас нет на сайте
| E][pert, ну, попробуй для C# также сделать, как для С написано, я не думаю, что они слишком сильно различаются в этом, это самый примитив для высших языков программирования. Или поищи книгу для C#, типа "с нуля". Добавлено (05.04.2011, 14:45) ---------------------------------------------
Quote (E||pert) Не удается мне временем повлиять на рандом. А тут на рандом влиять и не надо. Узнаёшь системное время, разбиваешь на годы, месяцы, часы, минуты, секунды и миллисекунды - для каждой свою переменную, потом применяешь формулу, которую написал Kefir87.
|
| |
| | |
| Kefir87 | Дата: Вторник, 05.04.2011, 14:45 | Сообщение # 11 |
|
участник
Сообщений: 129
Сейчас нет на сайте
| Попробуй так Code z:=(h+min*sec) mod milisec; Вообщем эксперементируй
Сообщение отредактировал Kefir87 - Вторник, 05.04.2011, 14:46 |
| |
| | |
| E][pert | Дата: Вторник, 05.04.2011, 14:52 | Сообщение # 12 |
C#-XNA-Unity
Сообщений: 423
Сейчас нет на сайте
| TimKruz, на подобии С не получиться так как там использована функция аналогов которой я в С# не знаю Не такой уже и случайный у меня ландшафт получился  Добавлено (05.04.2011, 14:52) --------------------------------------------- Если объявить так: Code Random rand = new Random(); То в XNA генерирует числа в промежутку времени. Возникла идея сейчас попробую.
Нажми на мою подпись, попади в мой блог. Помогаю по мере возможностей, учусь по мере сил. ©E}{pert
|
| |
| | |
| zodiak | Дата: Вторник, 05.04.2011, 14:55 | Сообщение # 13 |
участник
Сообщений: 226
Сейчас нет на сайте
| Копипаста из МСДН. И нефиг придумывать велосипеды. Справку нужно читать. Quote Генерация случайных чисел начинается с начального значения. При повторном использовании того же начального значения создается та же последовательность чисел. Одним из способов получения различных последовательностей является выбор зависимого от времени начального значения, что позволяет создавать различные последовательности для каждого нового экземпляра Random. По умолчанию в лишенном параметров конструкторе класса Random для генерации начального значения используются системные часы, в то время как параметризованный конструктор данного класса может принимать значение типа Int32, зависящее от количества тактов в текущем времени. Однако, вследствие конечности разрешающей способности часов при создании различных объектов Random в закрытой последовательности создаются генераторы случайных чисел, производящие идентичные числовые последовательности. Эту проблему можно устранить, создав единый объект Random вместо нескольких генераторов случайных чисел. Для повышения производительности нужно создать один объект Random для генерации множества случайных чисел с течением времени, отказавшись от создания новых генераторов Random для каждого случайного числа.
Точка зору окремо взятого індивіда завжди суб'єктивна!
C++/C# программист. Ищу команду.
|
| |
| | |
| E][pert | Дата: Вторник, 05.04.2011, 14:56 | Сообщение # 14 |
C#-XNA-Unity
Сообщений: 423
Сейчас нет на сайте
| TimKruz, а как узнать системное время то?
Нажми на мою подпись, попади в мой блог. Помогаю по мере возможностей, учусь по мере сил. ©E}{pert
|
| |
| | |
| TimKruz | Дата: Вторник, 05.04.2011, 15:00 | Сообщение # 15 |
старожил
Сообщений: 1588
Сейчас нет на сайте
| Вот, поискал в интернете, понял. Операцией Quote (zodiak) Random rnd = new Random(); мы создаём экземпляр класса random, потом с помощью его функций next и других (я C# не знаю) получаем новые случайные числа. Зачем создавать экземпляр? Потому что этот класс не статичный, для каждого экземпляра генерируются свои функции. Т.е. чтобы сменить алгоритм, думаю, надо уничтожить текущий экземпляр и создать новый, у него будут новые функции, т.е. работающие на других алгоритмах. По крайней мере, это я понял, глянув статью в интернете... (вот та статья) Извиняюсь, если ошибся, но, думаю, это так и есть.Добавлено (05.04.2011, 15:00) ---------------------------------------------
Quote (E||pert) TimKruz, а как узнать системное время то? Обратись к функциям Win32. Смотри справку.
|
| |
| | |
| den94ka | Дата: Вторник, 05.04.2011, 15:32 | Сообщение # 16 |
постоянный участник
Сообщений: 288
Сейчас нет на сайте
| По идее Code Random rnd = new Random(); int новое число = rnd.Next(минимальное, максимальное); А вот если сделать так: (точно не помню) Code Random rnd1 = new Random(1); int ch1 = rnd.Next(минимальное, максимальное); Random rnd2 = new Random(1); int ch2 = rnd.Next(минимальное, максимальное); (параметры, которые передаются в конструктор одинаковые), то и числа ch1 и ch2 будут одинаковы.
|
| |
| | |
| E][pert | Дата: Вторник, 05.04.2011, 15:46 | Сообщение # 17 |
C#-XNA-Unity
Сообщений: 423
Сейчас нет на сайте
| den94ka, дело не в этом, каждый раз при запуске набор числе один и тот же.
Нажми на мою подпись, попади в мой блог. Помогаю по мере возможностей, учусь по мере сил. ©E}{pert
|
| |
| | |
| nilrem | Дата: Вторник, 05.04.2011, 16:52 | Сообщение # 18 |
Просветленный разум
Сообщений: 1156
Сейчас нет на сайте
| Вот код, при запуске значение будет каждый раз разное. Как выше написал зодиак, конструктор без параметров инициализирует генератор текущим временем сам. Code static void Main(string[] args) { Random rnd = new Random(); Console.WriteLine(rnd.Next()); Console.WriteLine("Нажмите любую клавишу..."); Console.ReadKey(); } Пример ниже.
Foundling - масштабная 2D RPG для мобильных устройств WindMill 2D Game Engine
|
| |
| | |
| E][pert | Дата: Вторник, 05.04.2011, 17:21 | Сообщение # 19 |
C#-XNA-Unity
Сообщений: 423
Сейчас нет на сайте
| nilrem, спасибо но к сожалению мне в ХНА не удастся решить проблему данным образом. У меня возникла идея как сделать.
Нажми на мою подпись, попади в мой блог. Помогаю по мере возможностей, учусь по мере сил. ©E}{pert
|
| |
| | |
| den94ka | Дата: Вторник, 05.04.2011, 17:26 | Сообщение # 20 |
постоянный участник
Сообщений: 288
Сейчас нет на сайте
| Есть идея - просто получи микровремя (со дня создания unix). Умножь последнюю цифру на предпоследнюю и вычти предпредпоследнюю. Точно рандом будет)
|
| |
| |
|