/***************************************
	Auteur : Pierre Aubert
	Mail : pierre.aubert@lapp.in2p3.fr
	Licence : CeCILL-C
****************************************/
#ifndef __RANDINIT_IMPL_H__
#define __RANDINIT_IMPL_H__
#include <cmath>
#include <limits>
#include "randinit.h"
///Generates random value
/**	@param val : random value between inf and sup
 * 	@param inf : minimum value of the random uniform value
 * 	@param sup : maximum value of the random uniform value
*/
template<typename T>
void setRandValue(T & val, const T & inf, const T & sup){
	T fourchette = sup - inf;
	//l'utilisation de double est nécéssaire pour permettre de bons tirages aléatoires avec des nombres entiers
	T alea = (T)((((double)fourchette)*((double)rand()))/((double)(RAND_MAX)));
	val = alea + inf;
}
///Generates random value
/**	@param inf : minimum value of the random uniform value
 * 	@param sup : maximum value of the random uniform value
 * 	@return random value between inf and sup
*/
template<typename T>
T getRandValue(const T & inf, const T & sup){
	T val;
	setRandValue(val, inf, sup);
	return val;
}
///Set values at random places in the given table
/**	@param[out] tabValue : table to be modified
 * 	@param nbValue : number of value in the table
 * 	@param nbNan : number of NaN to be put in the table
 * 	@param value : 
 * 	NaN concerns only float and double
*/
template<typename T>
void setValueInTable(T * tabValue, size_t nbValue, size_t nbNan, T value){
	if(nbNan >= nbValue){
		for(size_t i(0lu); i < nbValue; ++i){
			tabValue[i] = value;
		}
		return;
	}
	for(size_t i(0lu); i < nbNan; ++i){
		size_t index(getRandValue(0lu, nbValue));
		tabValue[index] = value;
	}
}
#endif

