JSFiddle - React, Tailwind, and code Playground
by mgibsonbr
HTML
<input type="text" name="qtdeQuestoes" id="qtdeQuestoes" size="3" maxlength="3" style="cursor: default;" value="200">
<input type="button" style="height: 30px; cursor: default;" id="geraAleatorio" value="Gerar">
<table id="tb-questoes-selecionadas" cellspacing="1">
<tbody>
<tr class="grid-table-title">
<td align="center" style="background-color: #e5e5e5;">Nome</td>
<td align="center" style="background-color: #e5e5e5;">Max</td>
<td align="center" style="background-color: #e5e5e5;">Qtde</td>
</tr>
<tr class="trRemove">
<td class="td-center-center">teste 1</td>
<td class="td-center-center"><input id="total" value="150" /></td>
<td class="td-center-center">
<input type="text" maxlength="3" rel="146" name="D" id="146D" value="0" class="qtdeAssunto cadeadoaberto" style="width:30px;">
</td>
</tr>
<tr class="trRemove">
<td class="td-center-center">teste 2</td>
<td class="td-center-center"><input id="total" value="130" /></td>
<td class="td-center-center"> <input type="text" maxlength="3" rel="2824" name="A" id="2824A" value="0" class="qtdeAssunto cadeadoaberto" style="width:30px;"> </td>
</tr>
</tbody>
</table>
JavaScript
var limiteQuestoes = 200;
$("#geraAleatorio").click(function(){
var colunasAbertas = $("#tb-questoes-selecionadas").find(".qtdeAssunto.cadeadoaberto");
var totalCampos = colunasAbertas.length;
var rand = new Array();
var randFinal = new Array();
var qtde = parseInt($("#qtdeQuestoes").val());
if(qtde <= limiteQuestoes){
var qtdeQuestoes = qtde;
}else{
alert("A quantidade máxima é " + limiteQuestoes + "!");
var qtdeQuestoes = limiteQuestoes;
$("#qtdeQuestoes").val(limiteQuestoes);
}
if(qtdeQuestoes >= totalCampos){
/////////////////////////////////////////
var alvo = qtde;
var linhas = $.map($("#tb-questoes-selecionadas tr").find("input:eq(0)"),
function(x) {
return { min:0, max: parseInt($(x).val(),10) };
});
var resultado = [];
// Atribuindo os mínimos
for ( var i = 0 ; i < linhas.length ; i++ ) {
resultado[i] = linhas[i].min;
alvo -= linhas[i].min;
}
for ( var i = 0 ; i < linhas.length ; i++ ) {
var somaMax = 0;
for ( var t = i+1 ; t < linhas.length ; t++ )
somaMax += (linhas[t].max - linhas[t].min);
var minimo = alvo < somaMax ? 0 : alvo - somaMax;
var maximo = Math.min(alvo, linhas[i].max - linhas[i].min);
var valor = Math.floor(Math.random()*(maximo-minimo) + minimo);
resultado[i] += valor;
alvo -= valor;
}
$("#tb-questoes-selecionadas tr").find("input:eq(1)").each(
function(i) {
$(this).val(resultado[i]);
});
/////////////////////////////////////////
}else{
alert("O número de questões não pode ser menor que a quantidade de linhas.");
}
});