Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2010, 12:50   #1
pa6kevi4
Пользователь
 
Регистрация: 15.09.2009
Сообщений: 52
Смущение Random возвращает одни и те же значения

Скажите, почему Random возвращает одни и те же значения???
Тот который за цвет отвечает. Цвет у всех фигур получается одинаковым....

Код:
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Number3
{
    class Program
    {
        static void Main(string[] args)
        {
            /*Rectangle figure;

            figure = new Rectangle(20, 10);
            System.Console.Write(figure.Color + " " + figure.getTheType() + " with the following area: " + figure.Area + "\n");

            figure = new Square(20, 10);
            System.Console.Write(figure.Color + " " + figure.getTheType() + " with the following area: " + figure.Area + "\n");

            figure = new Circle(20, 10);
            System.Console.Write(figure.Color + " " + figure.getTheType() + " with the following area: " + figure.Area + "\n");

            figure = new Triangle(20, 10);
            System.Console.Write(figure.Color + " " + figure.getTheType() + " with the following area: " + figure.Area + "\n");
            */

            Rectangle figure;

            int[] figureArray;
            figureArray = new int[15];
            Random rand = new Random();

            for (int count = 0; count < 15; count++)
            {
               figureArray[count] = rand.Next(4) + 1;
               switch (figureArray[count])
               {
                   case 1: figure = new Rectangle(rand.Next(50) + 1, rand.Next(50) + 1); break;
                   case 2: figure = new Square(rand.Next(50) + 1, 0); break;
                   case 3: figure = new Circle(rand.Next(50) + 1, 0); break;
                   case 4: figure = new Triangle(rand.Next(50) + 1, rand.Next(50) + 1); break;
                   default: figure = new Rectangle(0, 0); break;
               }
               System.Console.Write(figure.Color + " " + figure.getTheType() + " , his area: " + figure.Area + "\n");
            }

            System.Console.ReadKey();
        }
    }

    class Rectangle
    {
        protected double a;
        public double A
        {
            set
            {
                a = value;
            }
            get
            {
                return a;
            }
        }
        protected double b;
        public double B
        {
            set
            {
                b = value;
            }
            get
            {
                return b;
            }
        }
        public string Color
        {
            get
            {
                return defColor(); 
            }
        }
        public double Area
        {
            get
            {
                return getArea();
            }
        }

        //constructor
        public Rectangle(double a_side, double b_side)
        {         
            a = a_side;
            b = b_side;
        }

        public virtual string getTheType()
        {
            return "rectangle";
        }

        public virtual double getArea()
        {
            return a * b;
        }

        public string defColor()
        {
            Random rnd = new Random();
            int num = rnd.Next(7) + 1;
            switch (num)
            {
                case 1: return "Red";
                case 2: return "Orange";
                case 3: return "Yellow"; 
                case 4: return "Green"; 
                case 5: return "Lightblue"; 
                case 6: return "Blue"; 
                case 7: return "Purple"; 
                default: return "Unknown color"; 
            }
        }
    }

    class Square : Rectangle
    {
        public Square(double a_side, double b_side)
            : base(a_side, b_side)
        {
        }

        public override string getTheType()
        {
            return "square";
        }

        public override double getArea()
        {
            return a * a;
        }
    }

    class Circle : Rectangle
    {
        public Circle(double radius, double b_side)
            : base(radius, b_side)
        {
        }

        public override string getTheType()
        {
            return "circle";
        }

        public override double getArea()
        {
            return 3.14 * (a * a);
        }

    }

    class Triangle : Rectangle
    {
        public Triangle(double catet_a, double catet_b)
            : base(catet_a, catet_b)
        {
        }

        public override string getTheType()
        {
            return "triangle";
        }

        public override double getArea()
        {
            return (a * b) /2;
        }
    }
}
pa6kevi4 вне форума Ответить с цитированием
Старый 22.05.2010, 13:46   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

попробуйте заменить строчку
Цитата:
Код:
           Random rand = new Random();
на строчку
Код:
           Random rand = new Random(DateTime.Now.Millisecond);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.05.2010, 14:08   #3
pa6kevi4
Пользователь
 
Регистрация: 15.09.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
попробуйте заменить строчку
на строчку
Код:
           Random rand = new Random(DateTime.Now.Millisecond);
Всё к сожалению по прежнему.

Заметьте, у меня 2 рандома.
Random rnd = new Random(DateTime.Now.Millisecond);
Random rand = new Random(DateTime.Now.Millisecond);

Я их оба заменил, но не сработало.
pa6kevi4 вне форума Ответить с цитированием
Старый 22.05.2010, 18:11   #4
pa6kevi4
Пользователь
 
Регистрация: 15.09.2009
Сообщений: 52
По умолчанию

ну кто знает в чем дело?
pa6kevi4 вне форума Ответить с цитированием
Старый 22.05.2010, 19:58   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вроде так
Код:
var value = (new Random()).Next(int.MaxValue);
BOBAH13 вне форума Ответить с цитированием
Старый 22.05.2010, 21:29   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

pa6kevi4
рандом, судя по всему построен на получении числа иницилизируя последовательность от системного таймера. скорость выполнения такова, что вызовы defColor() происходят БЫСТРЕЕ, чем успевает смениться таймер.

пути решения проблемы.
Либо, перекроить программу, вынеся определения генератора случайных чисел
Random rnd = new Random();
из процедуры public string defColor()
куда нибудь в высший уровень (на уровень Class Program, например).


либо изменить принцип генерации случайной величины.
например, так:
Код:
        public string defColor()
        {
            int numPrev = (new Random()).Next(7) + 1;
            int num = (new Random()).Next(7) + 1;
            while (num == numPrev) {
              num = (new Random()).Next(7) + 1;            	
            }
            switch (num)
      ......
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.05.2010, 23:27   #7
pa6kevi4
Пользователь
 
Регистрация: 15.09.2009
Сообщений: 52
Радость

Спасибо, сам бы точно не догадался
pa6kevi4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос возвращает пустую таблицу, если один из подзаросов возвращает пустую таблицу ArtInt SQL, базы данных 9 12.05.2010 15:40
Функция не возвращает значения 2.0 Winlook PHP 1 10.05.2010 00:58
Почему одни единицы ? vasyapupkin Общие вопросы C/C++ 1 12.04.2010 17:43
Exel 2007 не возвращает значения DATE NameX Microsoft Office Excel 10 03.02.2010 11:40
Вывод в memo.lines значения R:=random Алексей_xXx Помощь студентам 3 24.05.2009 11:26