Example #1
0
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);
  }
}
Example #2
0
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))));
}