Есть ли какой-либо независимый от типа генератор случайных чисел для C ++?

У меня есть класс, который хранит и обрабатывает данные типа T, который является просто именем класса шаблона.

template<class T=float>
class myClass {
public:
    //...
};

Внутри одной из его функций я хотел бы генерировать случайные числа с заданным максимальным абсолютным значением.

Я начал с:

T randvalue = ((T)rand() / RAND_MAX)*MAX_ABS

Он работает с float и double. Но я бы хотел, чтобы он работал и с комплексными числами. Если double преобразовано в complex<double>, то у него будет только реальная часть. Мнимая часть остается нулевой, поэтому в настоящий момент я не могу генерировать комплексные числа с мнимой частью.

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

Класс T - это тип, в котором определены abs, +, -, *, /.


person Iter Ator    schedule 22.12.2015    source источник
comment
Просто используйте два случайных числа, если тип сложный. И кстати. В C ++ есть шаблоны генераторов случайных чисел, но я считаю, что они работают только со встроенными типами.   -  person MikeMB    schedule 22.12.2015
comment
Я бы хотел реализовать его без веток, если это возможно. Комплекс был просто примером, почему мой код не работает во всех случаях.   -  person Iter Ator    schedule 22.12.2015
comment
Вам не нужны ветки - вы можете просто специализировать свой шаблон на комплексных числах. Вы, конечно, можете записать случайные биты в адрес памяти вашей переменной, но я не уверен, всегда ли это будет приводить к значениям leagle.   -  person MikeMB    schedule 22.12.2015
comment
Подумайте также о дистрибутиве, который вы хотите использовать. Например, вы хотите, чтобы равномерно распределилась какая-то область комплексной плоскости? Если это так, то просто случайное создание реального и изображения не поможет. Еще несколько идей: stackoverflow.com/questions/5837572/   -  person vsoftco    schedule 22.12.2015
comment
Проблема, которую я вижу с комплексными числами, заключается в том, как определить интервал? Обычно вы запрашиваете случайное число между двумя разными значениями. Как это должно работать с комплексными числами? Пифагор? Или два отдельных интервала? Я думаю, что шаблонный генератор случайных чисел многого требует, чтобы заранее охватить неизвестные типы, если только они не имитируют встроенные типы.   -  person Galik    schedule 22.12.2015


Ответы (1)


Вы можете использовать перегрузку:

с чем-то вроде

template <typename T> struct tag {};
float create_random(tag<float>);
double create_random(tag<double>);
template<typename T>
complex<T> create_random(tag<complex<T>> c);

использовать

T randvalue = create_random(tag<T>{});

или специализация шаблона:

template <typename T>
struct random_generator
{
    T operator()(); // you can provide default implementation.
};

template <> float random_generator<float>::operator()() {/**/}
template <> double random_generator<double>::operator()() {/**/}
template <typename T> complex<T> random_generator<complex<T>>::operator()() {/**/}

и использовать это

T randvalue = random_generator<T>(/**/)();

Примечание: у вас генератор лучше, чем rand в <random>

person Jarod42    schedule 22.12.2015