Генерация случайных чисел от-n до n в C

Я использовал matlab много лет в моем исследовании. Это является большим для линейной алгебры и имеет большой набор правильно написанных панелей инструментов. Новые версии начинают продвигать его в то, чтобы быть ближе к языку общего назначения (лучшие оптимизаторы, намного лучшая объектная модель, более богатые правила обзора, и т.д.).

Это прошлым летом, у меня было задание, где я использовал Python + numpy вместо Matlab. Я наслаждался изменением темпа. Это - "реальный" язык (и все, что влечет за собой), и это имеет некоторые большие числовые функции как широковещательная передача массивов. Мне также действительно нравится ipython среда.

Вот некоторые вещи, которые я предпочитаю о Matlab:

  • непротиворечивость: MathWorks потратил большое усилие, заставляющее панели инструментов смотреть и работать друг как друг. Они не сделали идеального задания, но это - один из лучших, я видел кодовую базу, это - старые десятилетия.
  • документация: я нахожу очень печальным выяснить некоторые вещи в numpy и/или Python, потому что качество документации является пятнистым: некоторые вещи документируются очень хорошо, некоторые нисколько. Является часто самым печальным, когда я вижу вещи, которые появляются имитатору Matlab, но не делают вполне , работают то же. Способность захватить источник неоценима (для ярмарки, большая часть поставки панелей инструментов Matlab с источником также)
  • компактность: для того, что я делаю, синтаксис Matlab часто более компактен (но не всегда)
  • импульс: у меня есть слишком много кода Matlab для изменения теперь

, Если бы у меня не было такой большой существующей кодовой базы, я серьезно рассмотрел бы переключение на Python + numpy.

5
задан avd 4 November 2009 в 09:07
поделиться

3 ответа

Одна из идей может заключаться в генерации случайного числа 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 () ; он объясняет вышеупомянутое использование.

9
ответ дан 18 December 2019 в 14:48
поделиться

Самое простое, что я могу предложить, - это сгенерировать случайное число от 0 до 2n, а затем выполнить математический трюк:

result= n - randomNumber 

Хотя 0 может быть очень маловероятным, вы можете проверить это используя If и повторить генерацию случайных чисел.

3
ответ дан 18 December 2019 в 14:48
поделиться
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;
}
1
ответ дан 18 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: