Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
1

Рандом не рандомный

01.08.2015, 17:26. Показов 2127. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет! Имею класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class Block
    {
        public Block(int X, int Y)
        {
            posX = X;
            posY = Y;
        }
        public int posX;
        public int posY;
        public void Paint(Graphics g)
        {
            SolidBrush two = new SolidBrush(color());
            g.FillRectangle(two, posX, posY, 20, 20);
        }
        private Color color()
        {
            Random D = new Random();
            int a = D.Next(1, 12);
            switch (a)
            {
                case (1):
                    return Color.Aqua;
                case (2):
                    return Color.MediumBlue;
                case (3):
                    return Color.DeepPink;
                case (4):
                    return Color.Gold;
                case (5):
                    return Color.Red;
                case (6):
                    return Color.Silver;
                case (7):
                    return Color.Violet;
                case (8):
                    return Color.SpringGreen;
                case (9):
                    return Color.Magenta;
                case (10):
                    return Color.Gray;
                default:
                    return Color.Black;
            }
        }
Зарисовываю всю поверхность пикчербокса объектами класса блок:
C#
1
2
3
4
5
6
7
pictureBox1.Image = new Bitmap(400, 400);
            System.Drawing.Graphics G = Graphics.FromImage(pictureBox1.Image);
            for (int i = 0; i < 401; i+=20)
                for (int j = 0; j < 401; j += 20)
                    Block.Add(new Block(i, j));
            foreach (var A in Block)
                A.Paint(G);
Вот мой результат: первые 3 столбика - пошаговый проход через f11(работает как надо), остальное - обычная компиляция. Если запускаю через f5 то все кубики одного цвета, либо пополам (часть одного цвета, остальное - другого) То ли я дурак, то ли лыжи не едут..
Миниатюры
Рандом не рандомный  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2015, 17:26
Ответы с готовыми решениями:

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

Рандом в пайтон (аппаратный рандом для генерации паролей)
суть такова есть такой скрипт на питоне wavBuf = dwParam1.contents if...

VBScript-овский рандом совсем не рандом
Не знаю, может я ошибаюсь, но по-моему VBScript-овский рандом совсем не рандом, т.е., генерит он...

Рандом совсем не рандом
Здравствуйте,столкнулся с проблемой,что при создании рандомных координат,для вывода на экран...

6
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
01.08.2015, 17:50  [ТС] 2
Проблема и в студии 2008 года, и в 2012, остальные участки кода на работу не влияют, тестировал на пустом проекте..
0
80 / 73 / 25
Регистрация: 26.10.2010
Сообщений: 231
01.08.2015, 18:49 3
проверьте поведение с такой вот поправкой static:
C#
1
static Random D = new Random();
1
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,661
Записей в блоге: 14
01.08.2015, 19:51 4
Цитата Сообщение от Рядовой Посмотреть сообщение
Random D = new Random();
Создание объекта должно быть только 1 раз, а после только вызов Next().
То же, что и в C, srand - однократная инициализация, rand() - получение следующего значения.
Указанный выше static один из возможных вариантов.
1
35 / 35 / 20
Регистрация: 11.08.2012
Сообщений: 142
01.08.2015, 20:14 5
Рядовой,
У Вас при каждом вызове метода color() создаётся новый объект типа Random. Создайте объект типа Random в определении класса - не важно, статический или нет. А в своём методе color() просто вызывайте метод Next(), созданного ранее объекта.

Добавлено через 21 минуту
Цитата Сообщение от Весельчак-У Посмотреть сообщение
не важно, статический или нет
Прошу прощения! Здесь, наверное, лучше - статический.
1
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
01.08.2015, 23:40  [ТС] 6
Всем большое спасибо, работает как надо, но поясните, почему при пошаговой проверке - все работает как нужно?
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,661
Записей в блоге: 14
01.08.2015, 23:43 7
Потому что при пошаговом выполнении Random инициализируется в разное время, от этого меняются выдаваемые результаты.
При нормальном же вызовы инициализации идут один за другим, получение случайного числа тоже через стабильное время, и числа в итоге вовсе не случайные.
0
01.08.2015, 23:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2015, 23:43
Помогаю со студенческими работами здесь

Рандомный текст
Дан текст, есть ли в этом тексте цифры и сколько цифр в этом тексте.

Не рандомный rand()
Есть код: for (int i = 0; i &lt; 3; i++) { srand(time(0)); InitUnit(troops); } do...

Рандомный стринг
Есть ли стандартные методы для создания рандомной строки? Или надо по своему писать? Добавлено...

рандомный массив
требутеся описать функцию случайной генерации элементов массива. Описатть ф-цию, которая в новом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru