I’d like to be able to randomly pick a species that has a trophic level within a certain range.
num_animals = 40
trophic_position = rand(num_animals)
function target_species_check_change()
sp = rand((num_animal),1)
while (trophic_position[sp] < 0.3) && (trophic_position[sp] > 0.4)
sp = rand((num_animal),1)
end
return sp
end
target_species = target_species_check_change()
I would just want the number of the species (1:40) to be returned which corresponds to a trophic level between 0.3 and 0.4
The syntax to pick a random integer within a range is
sp = rand(1:num_animals)
If you have other questions please ask.
Thank you for your reply, I have updated by code below. I am unable to generate a target_species
that has a trophic_position
between 0.3
and 0.4
.
num_animals2 = 40
trophic_position2 = rand(num_animals2)
function target_species_check_change2()
sp = rand((1:num_animals2),1)[1]
while (trophic_position2[sp] < 0.3) && (trophic_position2[sp] > 0.4)
sp = rand((1:num_animals2),1)[1]
end
return sp
end
target_species = target_species_check_change()
trophic_position[target_species]
You have to use ||
instead of &&
, or the while
loop will never execute (since there is no number that is smaller than 0.3 and larger than 0.4).
Note that you can also replace rand((1:num_animals2),1)[1]
by rand(1:num_animals2)
. Right now you are allocating an unnecessary 1-element array every time.
Thank you for your reply. I though ||
means or from here.
I understand why &&
would not work from your explanation. There is probably a less confusing way to write my function.
It does mean “or”, which is what you want here.
I believe the following code does what you want more cleanly. I replaced your while
loop with elementwise broadcasting indicated by .
.
num_animals=40
trophic_position=rand(num_animals) #Create trophic position data for each animal
trophic_position_within_range=(trophic_position.>0.3) .& (trophic_position.<0.4) #Vector of true/false
animals_within_range=(1:num_animals)[trophic_position_within_range] #Vector of animals where trophic_position_within_range is true
random_animal_in_range=rand(animals_within_range) #Selects a random animal from the previous vector
or as a function:
function select_animal(num_animals,lower_bound,upper_bound)
trophic_position=rand(num_animals)
trophic_position_within_range=(trophic_position.>lower_bound) .& (trophic_position.<upper_bound)
animals_within_range=(1:num_animals)[trophic_position_within_range]
random_animal_in_range=rand(animals_within_range)
end
chosen_animal=select_animal(40,0.3,0.4)