Générer un nouveau aléa automatiquement suivant une condition

Bonjour à toutes et à tous,

Je ne sais pas si cela est possible, mais je cherche à re-generer un nouveau nombre aléatoire aléa() si un évènement ne remplit pas certaine condition.

exemple:

Je cherche à faire un tirage au sort aléatoire de 3 gagnant parmi des centaines de candidats, mais ce tirage ne peut être valide uniquement si l'age des 3 candidats est supérieur à 100 ( condition qui serait rare). Sinon je souhaite relancer automatiquement le tirage jusqu'à l'obtention de la condition (sans rafraichir le aléa(0) plusieurs fois manuellement. )

est-ce que cela est possible ? Faut il passer par une macro ?

merci d'avance.

Bonjour,

Oui il faut le faire via une macro

Je t'en ai fait une ... Dans ce cas, la plage A1:B41 contient les candidats en colonne 1 et les scores en colonne 2 :

function tirage(tab) {
  tab = tab ?? SpreadsheetApp.getActiveSheet().getRange('A1:B41').getValues();
  tab = tab.sort((a, b) => 0.5 - Math.random());
  if (tab[0][1] > 100 && tab[1][1] > 100 && tab[2][1] > 100) {
    SpreadsheetApp.getUi().alert(`Gagnants :

${tab[0][0]}
${tab[1][0]}
${tab[2][0]}`);
  } else {
    tirage(tab);
  }
}
image

Cordialement,

Ou plus simple encore (en filtrant les candidats qui ont le score requis pour éviter de faire plusieurs tirages) :

function tirage() {
  const tab = SpreadsheetApp.getActiveSheet().getRange('A1:B41').getValues().filter(a => a[1] > 100).sort((a, b) => 0.5 - Math.random());
  SpreadsheetApp.getUi().alert(`${tab[0][0]} / ${tab[1][0]} / ${tab[2][0]}`);
}

Ou encore plus court :

const tirage = () => Browser.msgBox(SpreadsheetApp.getActiveSheet().getRange('A1:B41').getValues().filter(a => a[1] > 100).sort((a, b) => Math.random() - 0.5).slice(0, 3).map(a => a[0]).join(' / '));

merci beaucoup !

votre rapidité est impréssionnante !

je vais regarder cela , car je ny connais malheureusement rien en macro ;)

en revanche je ne voit pas bien comment filtré , car 3 personnes de 20 ans ne correspondrait pas alors alors qu'une de 20 ans et une autre de 80 ans suffirait ?

9urnes-test.zip (405.91 Ko)

Bon, désolé je n'y arrive vraiment pas ...

si vous pouvez m'aider , voici le fichier en question ...
(jai du supprimer les infos confidentielles d'ou la lisibilité douteuse )

le nom des compagnies sont en colonne "B" , le montant en colonne "I" , le % en colonne "K" , la génération alea en "L" , puis le classement croissant en "M" ,

et la selection des 3 candidats en "N" & "O" .

Je voudrais que la somme des 3 candidats (% unit forecast ) soit au minimum 0,18 ( 18%) , sinon que cela re-génére un nouveau alea jusqu'a son l'obtention

Voila pour toi :

function tirage(tab, c14) {
  c14 = c14 ?? SpreadsheetApp.getActive().getSheetByName('Figures and stats').getRange('C14').getValue();
  tab = tab ?? SpreadsheetApp.getActiveSheet().getRange('B8:I17').getValues();
  tab = tab.sort((a, b) => 0.5 - Math.random());
  if ((tab[0][7] + tab[1][7] + tab[2][7]) / c14 >= 0.18) {
    SpreadsheetApp.getActiveSheet().getRange('O8:O10').setValues([[tab[0][0]], [tab[1][0]], [tab[2][0]]]);
  } else {
    tirage(tab, c14);
  }
}

Les formules intermédiaires peuvent êtres supprimées avec cette macro :

image

merci beaucoup !

je vais décortiquer cela pour essayer de comprendre

Rechercher des sujets similaires à "generer nouveau alea automatiquement suivant condition"