Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Аналог randsrc() в C#


Автор: VisMaster 16.12.2008, 10:10
Здравствуйте есть ли аналог в 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-ил - не помогла

Заранее благодарен...

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

Нет.

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

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


ЗЫ. Если вы пока не настолько суровы, для заполнения матрицы придется писать свою функцию. Либо искать сторонние матбиблиотеки, но здесь я пас.

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

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

считаю что вероятность появления 0 равна Р, а  вероятность появления 1 = (Р-1) , следовательно общее количество появлений 0  равна int (количество опытов)/Р = Count0, а затем генерю случайную последовательность из Count0 элементов, элементы с этими порядковыми номерами и будут нулями, во всех остальных будут 1. Идея топорная, но может быть кому то и подойдет...

Автор: Zakonnic 18.12.2008, 15:06
Ради спортивного интереса написал вам такую функцию  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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)