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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аналог randsrc() в C# 
:(
    Опции темы
VisMaster
Дата 16.12.2008, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте есть ли аналог в C# такой функции из matlab:


out = randsrc(m,n,[alphabet; prob])

Возвращает матрицу размером m на n, элементы которой являются независимыми случайными числами, выбираемыми из вектора-строки alphabet. Повторяющиеся значения в векторе alphabet игнорируются. Вектор-строка prob содержит вероятности появления символов, так что символу alphabet(k) соответствует вероятность prob(k), где k — целое число в диапазоне от единицы до размера вектора alphabet. Сумма элементов вектора prob должна быть равна единице

Если более подробно то необходимо 

out = randsrc(1,1,[0,1; 0.3, 0.7])

чтобы функция вернула  0 с вероятностью 0.3 от общего числа опытов...

Есть ли что то подобное? Google-ил - не помогла

Заранее благодарен...
PM MAIL   Вверх
Zakonnic
Дата 16.12.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(VisMaster @  16.12.2008,  10:10 Найти цитируемый пост)
есть ли аналог в C# такой функции из matlab

Нет.

Программисты на С# настолько суровы, что получают случайные числа бросанием кубика, а затем заполняют ими матрицу:
Код

        int[][] rnd = { 
            {1, 4, 3, 1}
            , {6, 2, 4, 1}
            , {5, 2, 3, 6} };


ЗЫ. Если вы пока не настолько суровы, для заполнения матрицы придется писать свою функцию. Либо искать сторонние матбиблиотеки, но здесь я пас.
--------------------
...и никогда не пишите в комментариях правду
PM MAIL ICQ   Вверх
diadiavova
Дата 16.12.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Ну такой хитроумной функции, видимо, действительно нет, всё таки дотнет - не математический пакет. Написать её видимо прийдётся самому, единственное добавление: для генерации (псевдо)случайных чисел существует класс System.Random.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
VisMaster
Дата 17.12.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да про System.Random  уже знаю. Нашел выход, не совсем правильный на мой взгляд, но хоть что то:

считаю что вероятность появления 0 равна Р, а  вероятность появления 1 = (Р-1) , следовательно общее количество появлений 0  равна int (количество опытов)/Р = Count0, а затем генерю случайную последовательность из Count0 элементов, элементы с этими порядковыми номерами и будут нулями, во всех остальных будут 1. Идея топорная, но может быть кому то и подойдет...
PM MAIL   Вверх
Zakonnic
Дата 18.12.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ради спортивного интереса написал вам такую функцию  smile  :

Код

        T[] GetRandomArray<T>(int length, T[] alphabet, double[] freq)
        {
            T[] result = new T[length];
            Random rnd = new Random();

            for (int i = 0; i < length; i++)
            {
                double f = 0, rndValue = rnd.NextDouble();
                for (int j = 0; j < freq.Length; j++)
                    if ((f += freq[j]) >= rndValue)
                    {
                        result[i] = alphabet[j];
                        break;
                    }
            }

            return result;
        }


Тест:

Код

            int length = 1000;
            int[] alphabet = { 0, 1, 2, 3 }; // чтобы удобнее считать было
            double[] freq = { 0.3, 0.1, 0.2, 0.4 };
            int[] result = GetRandomArray<int>(length, alphabet, freq);

            // подсчет результатов
            int[] counters = new int[alphabet.Length];
            for (int i = 0; i < length; i++)
            {
                counters[result[i]]++;
            }


Результат - в итоговом массиве содержится примерно 300 нулей, 100 единиц, 200 двоек и 400 троек.  smile 

--------------------
...и никогда не пишите в комментариях правду
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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