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;
}
function criarRoleta() {
var ret = [];
var soma = 0;
for ( var i = 0 ; i < linhas.length ; i++ ) {
var valor = linhas[i].max - resultado[i];
ret.push(valor+soma);
soma += valor;
}
return [ret,soma];
}
for ( var i = 0 ; i < alvo ; i++ ) {
var roleta = criarRoleta();
var sorteio = Math.floor(Math.random()*roleta[1]);
for ( var t = 0 ; t < linhas.length ; t++ )
if ( sorteio < roleta[0][t] ) {
resultado[t]++;
break;
}
}
$("#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.");
}
});