Вот итерационное решение с использованием циклов.Дает вам все возможные перестановки чисел, складывающихся до 1, с расстоянием между ними, кратным N. Идея здесь состоит в том, чтобы взять все числа от 0 до 1 (с расстоянием, кратным N между ними), затем для каждогоодин включает в новый столбец все числа, которые при добавлении не идут выше 1. Промыть и повторить, за исключением последней итерации, в которой вы только добавляете числа, которые завершают строку, сумму строки.
Как и люди, указанные в комментариях, если вы хотите N = 1/499 *, это даст вам действительно очень большую матрицу.Я заметил, что для N = 1/200 это заняло около 2, 3 минут, поэтому, вероятно, для N = 1/499 это заняло бы слишком много времени.
*seq(from = 0, to = 1, length.out = 500)
- это то же самое, что и seq(from = 0, to = 1, by = 1/499)
N = 1/2
M = 5
x1 = seq(0, 1, by = N)
df = data.frame(x1)
for(i in 1:(M-2)){
x_next = sapply(rowSums(df), function(x){seq(0, 1-x, by = N)})
df = data.frame(sapply(df, rep, sapply(x_next,length)))
df = cbind(df, unlist(x_next))
}
x_next = sapply(rowSums(df), function(x){1-x})
df = sapply(df, rep, sapply(x_next,length))
df = data.frame(df)
df = cbind(df, unlist(x_next))
> df
x1 unlist.x_next. unlist.x_next..1 unlist.x_next..2 unlist(x_next)
1 0.0 0.0 0.0 0.0 1.0
2 0.0 0.0 0.0 0.5 0.5
3 0.0 0.0 0.0 1.0 0.0
4 0.0 0.0 0.5 0.0 0.5
5 0.0 0.0 0.5 0.5 0.0
6 0.0 0.0 1.0 0.0 0.0
7 0.0 0.5 0.0 0.0 0.5
8 0.0 0.5 0.0 0.5 0.0
9 0.0 0.5 0.5 0.0 0.0
10 0.0 1.0 0.0 0.0 0.0
11 0.5 0.0 0.0 0.0 0.5
12 0.5 0.0 0.0 0.5 0.0
13 0.5 0.0 0.5 0.0 0.0
14 0.5 0.5 0.0 0.0 0.0
15 1.0 0.0 0.0 0.0 0.0