Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с Random, Не совсем случайные значения 
V
    Опции темы
Cancel156
  Дата 19.2.2009, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.1.2009

Репутация: нет
Всего: нет



Рандомно вытаскиваю из массива слова с помощью цикла for.
Результат примерно такой:
Слово1
Слово1
Слово1
Слово1
Слово2
Слово2
Слово2
Слово2 и т.д.

Такое ощущение что рандом меняется через какое то время.
Какбы есть метод который возвращает значение.
Если его вызвать несколько раз даже в ручную (в коде его прописать несколько раз) результат такой же.
Что с этим делать?
PM MAIL   Вверх
emmanuil
Дата 19.2.2009, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Чем меньше значение параметра в Next, тем больше шансов, что число будет повторяться. Да и числа то псевдослучайные. Почитай в МСДН про класс Random. 
Цитата(Cancel156 @  19.2.2009,  00:44 Найти цитируемый пост)
Что с этим делать?
А что ты хочешь сделать? Чтобы были случайные числа и предыдущие при этом не повторялись (что-то вроде перемешать)? ТОгда можно что-то вроде этого:
Код

        [STAThread]
        static void Main() {
            string[] ar = new string[] { "1", "2", "3", "4", "5", "6", "7" };
            Random r = new Random((int)DateTime.Now.Ticks);
            Collection<int> indexes = new Collection<int>();
            while (indexes.Count < ar.Length) {
                Console.WriteLine(ar[GetNext(r, ar.Length, indexes)]);
            }
        }

        public static int GetNext(Random r, int max, ICollection<int> indexes) {
            if (max == 0)
                return 0;
            int i = r.Next(max);
            if (indexes.Contains(i))
                return GetNext(r, max, indexes);
            indexes.Add(i);
            return i;
        }



Это сообщение отредактировал(а) emmanuil - 19.2.2009, 06:37
PM MAIL   Вверх
Bogdan1024
Дата 19.2.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 3
Всего: 13



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


--------------------
user posted image
PM MAIL   Вверх
Cancel156
Дата 19.2.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.1.2009

Репутация: нет
Всего: нет



Цитата

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

Нэ. До цикла создаётся  smile 

emmanuil, мне нужно чтоб они могли повторятся. В массиве гдето 50 слов так что совпадением это быть не может. Главное чтоб не повторялись 2 раза подряд.
А как задержку ставить? Чтобы цикл скажем каждый такт за секунду делал?

Добавлено @ 14:29
Проблема решена!
Поставил:
Код

Thread.Sleep(50);

И проблемы нет. Странно что ему нужно время чтобы цифру поменять  smile 

Это сообщение отредактировал(а) Cancel156 - 19.2.2009, 14:30
PM MAIL   Вверх
Bogdan1024
Дата 19.2.2009, 15:38 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 3
Всего: 13



Отличное решение smile
Приведи код, мэн! smile

Это сообщение отредактировал(а) Bogdan1024 - 19.2.2009, 15:38


--------------------
user posted image
PM MAIL   Вверх
emmanuil
Дата 20.2.2009, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Цитата(Cancel156 @  19.2.2009,  12:22 Найти цитируемый пост)
emmanuil, мне нужно чтоб они могли повторятся. В массиве гдето 50 слов так что совпадением это быть не может. Главное чтоб не повторялись 2 раза подряд.
Они подряд конечно могут повториться, но не постоянно так будет. Может в массиве у тебя слова одинаковые или что-то не так делаешь.
Цитата(Cancel156 @  19.2.2009,  12:22 Найти цитируемый пост)
Главное чтоб не повторялись 2 раза подряд.
И зачем такое вообще нужно? Если уж не повторяться, то тогда вообще не повторяться, а не только два слова подряд. Ну раз надо, то что-то вроде этого:
Код

        static void Main() {
            string[] ar = new string[] { "1", "2", "3", "4", "5", "6", "7" };
            Random r = new Random((int)DateTime.Now.Ticks);
            int lastIndex = -1;
            for (int i = 0; i < ar.Length; i++) {
                lastIndex = GetNext(r, ar.Length, lastIndex);
                Console.WriteLine(ar[lastIndex]);
            }
        }

        public static int GetNext(Random r, int max, int lastIndex) {
            if (max == 0)
                return 0;
            int i = r.Next(max);
            if (lastIndex == i)
                return GetNext(r, max, lastIndex);
            return i;
        }


PM MAIL   Вверх
mihryak
Дата 20.2.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



Цитата(emmanuil @  20.2.2009,  09:24 Найти цитируемый пост)
            if (lastIndex == i)
                return GetNext(r, max, lastIndex);

как-то сурово для этих целей рекурсию делать

PM MAIL ICQ   Вверх
emmanuil
Дата 20.2.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Цитата(mihryak @  20.2.2009,  07:58 Найти цитируемый пост)
как-то сурово для этих целей рекурсию делать
Нормально!  smile
Изменил первоначальный метод по-быстрому, особо не думая. smile
Конечно, в этом случае достаточно увеличить или уменьшить на единицу.
PM MAIL   Вверх
mihryak
Дата 20.2.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



Цитата(emmanuil @  20.2.2009,  14:44 Найти цитируемый пост)
в этом случае достаточно увеличить или уменьшить на единицу.

ну или по-честному получить следующее рандомное значение, но без рекурсии
Код

int i;
while ((i = random.Next()) == lastIndex)
{
}
return i;

PM MAIL ICQ   Вверх
emmanuil
Дата 20.2.2009, 17:03 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Цитата(mihryak @  20.2.2009,  12:34 Найти цитируемый пост)
ну или по-честному получить следующее рандомное значение, но без рекурсииКодincludeSyntax('csharp');int i;while ((i = random.Next()) == lastIndex){}return i;
Бесспорно, так менее ресурсоемко будет, но с рекурсией алгоритмы изящнее получаются (сугубо мое мнение).  smile Да и глубина тут маленькая будет, разницы не заметишь.
PM MAIL   Вверх
VideoSharp
Дата 12.3.2014, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 12.3.2014

Репутация: нет
Всего: нет



Возможно, вам поможет этот видео-ответ по Random'у:
http://www.youtube.com/watch?v=a03X9gmDmto
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.