Tirage au sort pondéré et reproductible avec graine
Ce sélecteur de gagnant avec graine choisit un nom dans une liste ordonnée et fournit toujours le même résultat tant que la liste, les poids et la graine restent inchangés.
Lancer gratuitement
Accordez une participation à chacun ou augmentez ce nombre pour représenter des actions bonus, des lots de billets ou d'autres règles publiées. Comme le calcul n'utilise ni horloge ni source aléatoire cachée, vous pouvez conserver la graine et les données avec le résultat, refaire le tirage plus tard et montrer précisément comment la personne gagnante a été désignée.
Préparez une liste ordonnée avec des poids fidèles
Commencez par une ligne par participant et conservez un ordre intentionnel et stable. Chaque ligne doit comporter un nom non vide. La valeur facultative entries est un entier positif : omettez-la pour attribuer une participation, indiquez deux pour doubler le poids de sélection, et ainsi de suite. Une personne disposant de cinq participations occupe cinq positions dans la réserve théorique de billets, tandis qu'une personne n'en ayant qu'une occupe une position. L'outil ne fusionne pas les noms en double, car ils peuvent correspondre à des enregistrements distincts légitimes et leur regroupement silencieux modifierait les probabilités annoncées. Si votre source peut contenir des doublons, décidez avant le tirage s'il faut les consolider et consignez cette décision. Figez également la liste ordonnée définitive avant d'annoncer la graine. Trier, ajouter ou supprimer une ligne, renommer quelqu'un ou changer un nombre de participations modifie les plages pondérées et peut donc changer le gagnant. Le calcul accepte jusqu'à 10,000 lignes et valide chaque poids sans arrondir les fractions ni accepter de ligne de poids nul. Ainsi, toute ligne transmise participe réellement et chaque quantité déclarée contribue directement à ses chances.
Employez une graine pour reproduire le tirage
Une graine est un texte non vide choisi pour le tirage, par exemple l'identifiant d'une campagne associé à une mention de sa date de clôture. Le sélecteur convertit ce texte exact en une valeur fixe non signée de 32 bits grâce à un hash documenté, puis associe cette valeur à une position dans la plage totale des participations pondérées. Il parcourt les participants dans l'ordre fourni et renvoie la ligne dont la plage cumulée contient cette position. Une graine, un ordre, des noms et des quantités identiques produisent toujours la même sortie dans l'API comme dans le navigateur. La casse, les espaces et la ponctuation comptent : enregistrez donc la chaîne d'origine exacte plutôt que de la ressaisir. Pour un processus public, prévoyez d'annoncer avant la clôture la méthode d'obtention de la graine, par exemple une valeur externe clairement définie et publiée après l'échéance. Cet outil est déterministe et non cryptographiquement aléatoire : il sert à rendre la sélection répétable et facile à contrôler, pas à fabriquer un secret imprévisible. Ne révélez pas trop tôt une graine librement choisie si la liste peut encore être adaptée au résultat anticipé.
Consignez et vérifiez le résultat gagnant
Le résultat contient le nom du gagnant, l'indice de sa ligne à partir de zéro, la position pondérée choisie également à partir de zéro, le nombre total de participations et le hash numérique issu de la graine. Conservez les données complètes avec ces champs dans le dossier du concours. Une autre personne pourra soumettre les mêmes lignes ordonnées et la même graine, confirmer le total et obtenir le même gagnant sans devoir croire une capture d'écran ou un bouton aléatoire inexpliqué. L'indice distingue aussi deux enregistrements affichant le même nom, tandis que la position pondérée montre où le choix se situe dans la réserve théorique. Si une nouvelle exécution diffère, comparez les données enregistrées caractère par caractère : même un nom nettoyé, une ligne déplacée, un poids ajusté ou une casse différente dans la graine définit un autre tirage. La version navigateur convient à une sélection manuelle transparente ; l'API coûte $0.002 par requête lorsque vous souhaitez automatiser la procédure dans un logiciel de campagne ou une piste d'audit. Dans les deux canaux, l'algorithme n'utilise ni réseau, ni heure courante, ni état mutable : l'environnement et la date d'exécution ne changent donc pas la réponse.
Cas d’usage
Tirer au sort un lot sur les réseaux sociaux
Figez les noms admissibles après l'échéance, publiez ou archivez la graine, puis désignez un gagnant reproductible.
Respecter les règles de participations bonus
Attribuez des quantités supérieures aux actions admissibles tout en gardant une sélection proportionnelle aux poids consignés.
Auditer la sélection d'une campagne
Conservez l'entrée ordonnée et les données de hash renvoyées afin qu'une autre personne puisse reproduire le résultat annoncé.
Questions fréquentes
Quel est le coût d'un tirage ?
Le tarif de l'API est de $0.002 par requête. Le même calcul déterministe peut aussi être exécuté gratuitement dans votre navigateur.
Que se passe-t-il si le nombre de participations est omis ?
La personne reçoit une participation. Les poids explicites doivent être des entiers positifs.
Une même graine désigne-t-elle toujours le même gagnant ?
Oui, à condition que la graine et toute la liste ordonnée, noms et quantités compris, soient identiques.
Le changement d'ordre des participants a-t-il un effet ?
Oui. L'ordre définit la plage de chacun dans l'ensemble pondéré ; déplacer les lignes crée donc une autre entrée de tirage.
Ce tirage est-il cryptographiquement aléatoire ?
Non. Il s'agit d'un sélecteur déterministe et transparent conçu pour être reproductible. Si l'imprévisibilité compte, choisissez une source de graine impossible à manipuler.
Pourquoi les noms en double restent-ils séparés ?
L'outil respecte chaque ligne reçue, car les doublons peuvent être intentionnels. L'indice renvoyé désigne précisément la ligne gagnante.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/game/giveaway-winner-pick \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"entrants":[{"name":"Avery","entries":1},{"name":"Blake","entries":3},{"name":"Casey"}],"seed":"spring-campaign-2026"}'const res = await fetch("https://api.kit.forhosting.com/game/giveaway-winner-pick", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"entrants": [
{
"name": "Avery",
"entries": 1
},
{
"name": "Blake",
"entries": 3
},
{
"name": "Casey"
}
],
"seed": "spring-campaign-2026"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/game/giveaway-winner-pick",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"entrants": [
{
"name": "Avery",
"entries": 1
},
{
"name": "Blake",
"entries": 3
},
{
"name": "Casey"
}
],
"seed": "spring-campaign-2026"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/game/giveaway-winner-pick", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"entrants":[{"name":"Avery","entries":1},{"name":"Blake","entries":3},{"name":"Casey"}],"seed":"spring-campaign-2026"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"entrants":[{"name":"Avery","entries":1},{"name":"Blake","entries":3},{"name":"Casey"}],"seed":"spring-campaign-2026"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/game/giveaway-winner-pick", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"entrants": [
{
"name": "Avery",
"entries": 1
},
{
"name": "Blake",
"entries": 3
},
{
"name": "Casey"
}
],
"seed": "spring-campaign-2026"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "game.giveaway_winner_pick",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_items | 10000 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |