Attention | Topic was automatically imported from the old Question2Answer platform. | |
Asked By | Titox |
I know this seems silly but I need to create a function generate_sum_array(seed,factor)
that will create an array of any number of elements arranged in random order in which all the array elements sum up to seed
and have each have element is divisible by factor
For example:
generate_sum_array(100.10)
should return something like
[20,10,40,10,20]
or [10,10,10,10,10,10,10,10,10,10]
or [50,20,10,30,]
etc. as long as the sum of all the elements is 100
the seed
There can be unlimited possibilities (I think…I am not really sure…How many different arrays can be generated)
Sounds like one hell of a question, don’t know the answer but,
you have a finite possibilities because you want all of them to have the same factor,
so the biggest array you can output will be equal to seed/factor
and have that same value as well…
just out of curiosity why do you need it for? and try asking a mathematician friend if you got one
rustyStriker | 2019-12-09 20:03
I did this function for you. It may be slow to find a correct array of numbers on some occasions
# This function returns an array of numbers whose sum is equal to "Seed"
# and these numbers are divisible by "Factor"
# "Factor" must be greater than 0, smaller than "Seed"
# and "Seed" must be divisible by "Factor"
func generate_sum_array(_seed : int, _factor : int, _min_size : int = 0) -> Array:
if _factor <= 0 || _factor > _seed || _seed % _seed != 0: return []
var correct_values = [1, _factor]
# Get correct values
for i in range(_factor, _seed):
if i == 1 || i == _factor: continue
if i % _factor == 0: correct_values.append(i)
# get any array of numbers whose sum = _seed:
var result = ""
var sum = 0
while result.length() == 0:
while sum < _seed:
randomize()
var i = randi() % correct_values.size()
sum += correct_values[i]
result += "%s" % correct_values[i] if result == "" else ",%s" % correct_values[i]
if sum > _seed:
sum -= correct_values[i]
for n in correct_values:
if n == correct_values[i]: continue
if sum + n == _seed:
result += "%s" % n if result == "" else ",%s" % n
break
result = ""
sum = 0
break
if _min_size != 0 && _min_size > result.split(",").size():
result = ""
return Array(result.split(","))
newold | 2019-12-09 23:37
Loot-Tables, Random Maps and Monsters - Part I - CodeProject
rakkarage | 2020-06-17 23:26