Se o conjunto de tarefas puder obter uma lista de números, uma abordagem seria fazer isso para obter uma lista de quatro números aleatórios:
$ for (( i=1;i<=16;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2|head -4
8
2
15
5
Outra ideia difícil seria encontrar um número aleatório raiz e adicionar 3 a ele assim:
$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."
Exemplos
$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."
taskset -c 1-4 rlwarp...
$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."
taskset -c 2-5 rlwarp...
$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."
taskset -c 12-15 rlwarp...
Solução final
A solução final do Chuu (como um liner):
$ RTEST=$(($RANDOM % 16));\
taskset -c "$((RTEST%16)),$(((RTEST + 1)%16)),$(((RTEST+2)%16)),$(((RTEST+3)%16))" rlwrap ...
Como funciona
Obtenha um número aleatório entre 1-16:
$ RTEST=$(($RANDOM % 16));
$ echo $RTEST
3
Fazendo a divisão do módulo 4 vezes, adicionando 1 a $ RTEST antes de nos permitir incrementar os números para gerar o intervalo:
$ echo $((RTEST%16)),$(((RTEST + 1)%16)),$(((RTEST+2)%16)),$(((RTEST+3)%16))
3,4,5,6
Realizar a divisão de módulo é uma ótima maneira de inserir um número para que você obtenha resultados em um intervalo específico.
$ echo $((RTEST%16))
3
$ echo $(((RTEST + 3)%16))
6
Isso garante que você sempre obterá um número entre 1-16. Ele até lida com o wrap quando recebemos números aleatórios acima de 13.
$ echo $(((14 + 3)%16))
1