генератор случайных чисел в matlab

marina19

Есть проблема с кособокостью rand.
Генерю числа от 0 до 1, тем, что меньше, например, 0+0.03 присваиваю -1, тем, что больше 1-0.03 присваиваю 1, остальным 0. Матожидание в подавляющем большинстве случаев больше 0.
Нужно более хорошо равномерно распределённые случайные числа. Что можете посоветовать?
Нашла в инете, что генератор случайных числе есть в Simulink'е, но у меня урезанный матлаб без симулинка. Если у кого есть Simulink, попробуйте его генератор, плз, он тоже косой или получше?

Serab

Генерю числа от 0 до 1, тем, что меньше, например, 0+0.03 присваиваю -1, тем, что больше 1-0.03 присваиваю 1, остальным 0. Матожидание в подавляющем большинстве случаев больше 0.
А почему должно быть по-другому-то?не заметил, что "остальным 0" :(

danilov

Может, дело в том, что отрезки для -1 и 1 не равны?
Ну, 1 - (1 - 0.03) не равно 0.03.
Если дело всё же в генераторе, а достаточно симметричного, то юзай rnd(0, 1) - rnd(0, 1) (или как они там вызываются)

Serab

Ну а вообще да, дело может быть в том, что 0.03 не представимо в двоичной системе точно, отсюда ошибки округления и все такое.

Serab

Ты лучше скажи каким типом данных считаешь, какой размер выборки. Вот.

marina19

Туплю :-(.
Это гениально, что отрезок 0..0.03 не равно отрезок 1-0.03..1. Теперь буду думать как это проверить и читать, как сравнить числа напрямую в двоичной записи.
сравниваю числа в десятичной записи, выборка 1000 случайных чисел.
вот такая прога
n=1000;
r = rand(n,1);
for index=1:n
    if r(index) < 0.03125
     res(index)=-1;
    elseif r(index) >= 0.03125 && r(index) < 0.96875
     res(index)=0;
    elseif r(index) >= 0.96875
     res(index)=1;
    end
end

lubanj

и на сколько большое отклонение от 0 получаешь?

Ivan8209

> Есть проблема с кособокостью rand.
> Нужно более хорошо равномерно распределённые случайные числа.
> Что можете посоветовать?
Прочитать, какой алгоритм встроен, и больше никогда его не использовать.
Написать МТ19937 или задействовать уже готовый, который можно взять
откуда угодно, поскольку алгоритм довольно популярен. Если МТ19937
слишком медленный, подсмотреть в GSL более подходящий.
---
"Лучше жалеть о сделанном, чем об упущенной возможности."

serg72

Может, выборка маловата?
 
 
>> a = rand(10000000,1);
>> a(a<0.03)=-1;
>> a(a>1-0.03)=1;
>> a(abs(a)<0.99)=0;
>> mean(a)
ans =
-4.5100e-005

А вообще, центральная предельная теорема работает для этого случая "на ура".

serg72

  
for i = 1:1000
a = rand(1000000,1);
a(a<0.03)=-1;
a(a>1-0.03)=1;
a(abs(a)<0.99)=0;
b(i) = mean(a);
end
length(find(b>0
ans =
453

  
>> hist(b,30)

Оставить комментарий
Имя или ник:
Комментарий: