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