int random_range(int lowest_number, int highest_number, DistributionType_t type /*= DISTRO_UNIFORM*/) { if(highest_number == lowest_number){ return lowest_number; } if(lowest_number > highest_number){ int nTmp = highest_number; highest_number = lowest_number; lowest_number = nTmp; } int range = highest_number - lowest_number; if(type == DISTRO_UNIFORM){ int r = rand24b() % (range + 1); return lowest_number + r; } else if(type == DISTRO_NORMAL){ float value = box_muller(0.5, 0.25); if(value < 0){ value = 0; }else if(value > 1){ value = 1; } return lowest_number + (int)((float)range * value); } else{ float r = 1.f - sqrt((1.f*rand24b())/RAND_MAX24); return lowest_number + (int)((float)range * r); } }
int32_t random_range(int32_t lowestNumber, int32_t highestNumber, DistributionType_t type /*= DISTRO_UNIFORM*/) { if(highestNumber == lowestNumber) return lowestNumber; if(lowestNumber > highestNumber) std::swap(lowestNumber, highestNumber); switch(type) { case DISTRO_UNIFORM: return (lowestNumber + ((int32_t)rand24b() % (highestNumber - lowestNumber + 1))); case DISTRO_NORMAL: return (lowestNumber + int32_t(float(highestNumber - lowestNumber) * (float)std::min((float)1, std::max((float)0, box_muller(0.5, 0.25))))); default: break; } const float randMax = 16777216; return (lowestNumber + int32_t(float(highestNumber - lowestNumber) * float(1.f - sqrt((1.f * rand24b()) / randMax)))); }