Я использовал matlab много лет в моем исследовании. Это является большим для линейной алгебры и имеет большой набор правильно написанных панелей инструментов. Новые версии начинают продвигать его в то, чтобы быть ближе к языку общего назначения (лучшие оптимизаторы, намного лучшая объектная модель, более богатые правила обзора, и т.д.).
Это прошлым летом, у меня было задание, где я использовал Python + numpy вместо Matlab. Я наслаждался изменением темпа. Это - "реальный" язык (и все, что влечет за собой), и это имеет некоторые большие числовые функции как широковещательная передача массивов. Мне также действительно нравится ipython среда.
Вот некоторые вещи, которые я предпочитаю о Matlab:
, Если бы у меня не было такой большой существующей кодовой базы, я серьезно рассмотрел бы переключение на Python + numpy.
Одна из идей может заключаться в генерации случайного числа x
в диапазоне [1,2n] включительно. Затем верните - (x - n)
для x
больше, чем n
, иначе просто верните x
.
Это должно работать:
int my_random(int n)
{
const int x = 1 + rand() / (RAND_MAX / (2 * n) + 1);
return x > n ? -(x - n) : x;
}
См. comp.lang.c FAQ для получения дополнительной информации о том, как безопасно использовать rand ()
; он объясняет вышеупомянутое использование.
Самое простое, что я могу предложить, - это сгенерировать случайное число от 0 до 2n, а затем выполнить математический трюк:
result= n - randomNumber
Хотя 0 может быть очень маловероятным, вы можете проверить это используя If и повторить генерацию случайных чисел.
int random(int N)
{
int x;
do{
x=rand()%(N*2+1)-N;
}while(x==0);
return x;
}
Он выбирает число от -N до N, но продолжает делать это, если оно равно 0.
Альтернативный вариант, предложенный в комментариях, генерирует число от -N до N -1 и увеличивает его, если он положительный, или 0:
int random(int N)
{
int x;
x=rand()%(N*2)-N;
if(x>=0) x++;
return x;
}