Cette question semble être le principal attracteur pour toutes les questions impliquant la création d'une source d'aléatoire dans Minecraft, mais la plupart des solutions sont réparties sur des questions connexes / dupliquées. Cette réponse compile les informations en un seul endroit pour fournir une solution plus complète au problème.
Ce post est très probablement incomplet - N'hésitez pas à modifier cet article en y ajoutant des informations supplémentaires ou des méthodes alternatives.
Une fois les explications terminées : Énumérons les autres solutions à la question, et pourquoi et comment elles sont applicables.
J'ai également ajouté un commentaire dans la liste qui est important pour toute personne chargée de la mise en œuvre, à savoir toutes les mises en garde relatives aux solutions qui ne sont pas déjà fournies dans les réponses elles-mêmes.
Hacks existants
La plupart d'entre eux utilisent une "source" existante ou construisent leur propre "base" d'aléatoire.
Quelques notations : S
est la variable indiquant le nombre d'états dans la sortie : C'est à dire la taille du dé lancé. N
est un facteur d'échelle variable par lequel le générateur peut être modifié ; N >= 1
et c'est un nombre entier. Les valeurs les plus simples pour S
pour travailler avec des puissances de deux dans le but de convertir en un nombre quelconque. Bien sûr, si tous les nombres sont disponibles, c'est encore mieux, mais le plus important est de pouvoir les convertir. efficace en termes de temps Les solutions ont tendance à être binaires.
https://gaming.stackexchange.com/a/18617
Un addendum à la réponse de @cyclops . Nécessaire pour l'implémenter (contient des moyens de construire certains sous-circuits auxquels la réponse fait référence). La réponse contient des explications détaillées et un circuit de redstone fonctionnel.
Une horloge n'est pas une très bonne source de hasard : regardez les speedruns de pokemon red noglitch pour savoir pourquoi : il s'avère que les humains peuvent devenir assez bons pour appuyer sur des boutons sur une certaine trame et faire de la rétro-ingénierie de systèmes RNG. Ceux-ci peuvent être trop simples à utiliser pour le joueur moyen qui battra votre système en utilisant sa dextérité.
https://gaming.stackexchange.com/a/215506
Fournit un exemple de construction d'un générateur de nombres aléatoires basé sur une minuterie. Contrairement à beaucoup d'exemples et de vidéos liés, il s'agit d'une bonne version pour un débutant : c'est une structure simple et plate qui n'utilise pas d'astuces compliquées de compactage de la redstone et de différents types de blocs alimentés comme la plupart des autres solutions explicites ; c'est "ungolfed", pour ainsi dire. Cela signifie qu'il a tendance à être gourmand en espace.
https://gaming.stackexchange.com/a/126893
Ajoute la notion de cellule mémoire à la solution canonique basée sur l'horloge (mais ne fournit pas d'implémentation concrète).
https://gaming.stackexchange.com/a/188261
Une autre façon de construire un circuit aléatoire basé sur une minuterie. Fournit une implémentation concrète.
https://gaming.stackexchange.com/a/31629
Fournit une description d'un circuit aléatoire basé sur une minuterie. Ne fournit pas d'implémentation concrète.
https://gaming.stackexchange.com/a/278591/148546
Fournit un moyen d'utiliser les blocs de commande pour stocker la sortie d'un circuit basé sur une minuterie.
https://gaming.stackexchange.com/a/203924
Ajoute un nouveau type de solution : Spawn un monstre dans un rayon, utiliser un tas de plaques de pression pour mesurer où il a frayé. Le monstre en déclencherait un au hasard. Ce n'est pas une solution parfaite :
- La fonction de reproduction du rayon n'est pas uniformément distribuée.
- Causes du bruit.
- Peut présenter un problème si le spawn est déclenché mais pas le kill.
- Sorties
S=(2N + 1)^2
valeurs (difficile de travailler avec)
https://gaming.stackexchange.com/a/126863 y https://gaming.stackexchange.com/a/141492
Le lien des réponses cette vidéo comme exemple de construction.
Utilise un distributeur pour faire suivre le RNG interne du distributeur. Configuration compliquée, lente, implique des articles, mais peut fonctionner. La réponse ne fournit pas d'implémentation concrète.
Ne fournit pas une sortie uniformément distribuée. Voir ce post reddit où l'utilisateur a testé une telle configuration .
Le wiki de Minecraft recommande certaines solutions de contournement et propose des configurations compactes et testées pour certains dispositifs RNG.
https://gaming.stackexchange.com/a/284279/148546
Utilise la répétition et des types d'objets variés, utilise également certaines des autres méthodes, mais pas comme source, simplement comme partie du dispositif. C'est un peu une solution Rube Goldberg, et la distribution ne sera pas uniforme : même en ignorant les bogues du distributeur, il y a un problème de distribution des différents points dans un schéma compliqué basé sur le nombre de points. répartition géométrique . Le char à mine peut faire une boucle autour de la piste avant de s'arrêter, en appliquant une opération modulo par-dessus, superposant une distribution géométrique discrète sur elle-même de manière récursive. En appliquant les mathématiques ; plus précisément, avec S=N
sorties :
![Probability distribution equation for the roulette]()
Ou, plus concrètement, en fixant N=5
voici la distribution :
k
P
1
.297
2
.238
3
.190
4
.152
5
.122
Cette solution ne donne donc pas tout à fait un résultat égal, même avant de prendre en compte le bug du distributeur. Elle a également une limite de 1 <= r <= 9
pour l'exposant, car il y a au maximum 9 emplacements. Il a S=r^N
lorsque vous exécutez plusieurs copies.
https://gaming.stackexchange.com/a/371339
Cette réponse utilise un distributeur de manière répétée (comme la précédente) pour créer une roulette russe avec 6 chambres, une balle en utilisant 5 piles uniques de 1 empilable et 1 non empilable pour créer la même augmentation de la chance de se faire tirer dessus (c'est à dire le "prendre des billes au hasard dans un sac de 1 rouge, 5 bleues"). Si c'est le jeu spécifique que vous voulez, une telle solution directe est préférable à la programmation de l'augmentation des chances de tirer la balle à chaque tirage en utilisant un RNG générique.
Elle utilise également une autre propriété d'un distributeur : selon qu'il contient un objet non empilable, il émet un signal de redstone différent, pour obtenir une construction beaucoup plus simple. Cette construction est seulement décrite ; la réponse ne contient aucune implémentation concrète.
https://gaming.stackexchange.com/a/229716
Un raffinement de l'article ci-dessus, qui utilise un ensemble de distributeurs de ce type en série. En utilisant une série de distributeurs, le bug ci-dessus est contourné dans une certaine mesure. Je n'ai pas trouvé de test de distributeur en ligne avec seulement deux sorties, il faudrait donc le tester également.
TODO restant : tester si ce qui précède fonctionne avec deux articles dans le distributeur. Si c'est le cas, alors c'est une très bonne base pour une solution. Malheureusement, la solution est incomplète. Une fois de plus, il manque une implémentation concrète. De plus, seules les puissances de deux sont disponibles.
Les trois vidéos liées traitent des autres méthodes, dans l'ordre (consultez la section correspondante pour plus d'informations) :
-
Un exemple de construction avec n'importe quel
S = N^2
sortie.
-
Un générateur de source de temporisation avec
S = 2N
valeurs. (voir l'explication de la source de la minuterie ci-dessus)
-
Solutions multiples : 3.1 Base du distributeur (cette section)
3.2 Basé sur les géniteurs (voir section ci-dessus).
3.3 Source du bloc de commande (voir section ci-dessous).
La version vidéo 3.2 de la base de spawner résout le problème du "kill", mais introduit un nouveau problème en déplaçant un monstre à la place. Si votre carte implique un /killall
(ce qui est assez courant pour se débarrasser des mobs aléatoires), le RNG cesse de fonctionner.
https://gaming.stackexchange.com/a/296219
C'est en fait une solution très intrigante. Malheureusement, la réponse est très courte, ne fournit pas d'implémentation concrète et ne donne pas les détails. En substance, elle exploite ce bug de Minecraft . Voir aussi Piston Minecraft se poussant l'un contre l'autre . Mises en garde :
- La machine est susceptible de produire le même résultat si elle est configurée de la même manière : il s'agit d'un hasard involontaire impliquant des implémentations Java internes.
- Si le bogue est corrigé un jour (ce qui est fort possible), la solution cessera de "fonctionner".
- Très susceptible d'échouer aux tests d'aléatoire de manière compliquée : Les cartes de hachage sont conçues pour l'efficacité de la mémoire, pas pour l'aléatoire.
- Source du bloc de commande
https://gaming.stackexchange.com/a/320840
La solution consiste à utiliser le @r
dans une commande dans un bloc de commande. La mise en garde est que seules certaines commandes prennent en charge l'utilisation de la balise @r
directement, et la réponse ne fournit pas un moyen d'implémenter une commande aussi spécifique pour fonctionner dans une machine arbitraire : produire une sortie aléatoire de 0
o 1
. Au lieu de cela, il implémente directement un téléporteur aléatoire, qui est une utilisation d'un générateur aléatoire (celui que le demandeur voulait), mais pas toutes les utilisations. en général .
Fonctionne avec potentiellement n'importe quel S=N
mais il peut être nécessaire de le tester ; je n'ai pas trouvé d'articles sur la fiabilité de ces produits. @r
mais je suppose que c'est probablement la meilleure solution dans la plupart des cas, puisqu'elle appelle directement la fonction Random()
En d'autres termes, il s'agit d'un véritable PRNG, intégré au langage Java, qui a fait ses preuves et qui est viable dans presque tous les cas d'utilisation non cryptographique.
Le site vidéo liée dans une réponse précédente le fait plus généralement à l'aide de blocs de commande. (Voir le point 3.3 de la section sur les blocs de commande). Source du distributeur Il s'agit d'une solution très intéressante, car elle constitue un raffinement de la méthode d'évaluation des risques. source du bloc de commande qui supprime son principal inconvénient ; il s'agit d'une commande de ce type (à deux lignes pour plus de lisibilité) :
/execute @r[type=ArmorStand,name=RandomGenerator001] ~ ~ ~ \
/summon FallingSand ~ ~ ~ {Tile:sand,Block:sand,Time:1,DropItem:0}
Utiliser des stands présentant ces caractéristiques :
{CustomName:"RandomGenerator001",CustomNameVisible:1,NoGravity:1}
Avec un tas d'ArmorStands flottants nommés RandomGenerator001
laisser tomber des tuiles de sable sur des plaques de pression qui disparaissent automatiquement. En utilisant S=N=8
(probablement le plus efficace), vous pouvez générer des octets aléatoires pour faire de très grands nombres aléatoires : par exemple, si vous voulez une sortie de 0 à 1 000 000, vous utiliserez évidemment 3 octets et laisserez tomber quelques bits ; relancer entre 1,000,000 < N < 1,048,576
.
https://gaming.stackexchange.com/a/285355/148546
Décrit une autre façon équivalente d'utiliser l'outil d'évaluation de la qualité de l'eau. @r
en faisant apparaître et disparaître des blocs de redstone. Fournit le code détaillé des blocs de commande mais pas de diagrammes détaillés sur la façon de construire le dispositif (seulement des descriptions difficiles à déchiffrer).
Source du melon
Un plutôt unique et très lente approche du problème, la réponse à Les melons préfèrent-ils pousser dans certaines directions ? nous offre une autre solution : Les blocs de melons laissent tomber les melons dans une direction aléatoire en utilisant à nouveau un bon PRNG. Les melons conduisent l'électricité de la redstone, donc en attendant qu'un melon apparaisse (puis en le retirant avec un bloc de commande), il peut être utilisé pour générer une séquence de nombres aléatoires. Ici, S = 4^N
générer un octet à la fois avec quatre constructions de ce type en appliquant une algèbre quadrooléenne (mélionienne ?).
Que faire des octets
Certains des appareils mentionnés ci-dessus ne peuvent produire des nombres aléatoires que dans une puissance de deux.
Disons que nous avons un engin qui produit des bits, des nybbles ou des octets aléatoires. Mais que se passe-t-il si nous voulons une autre sortie ? Et si notre nombre aléatoire devait être compris entre 1 et 18 ? La bonne réponse est d'utiliser l'encodage et le décodage.
Et si notre cible est un d6 ? comment-convertir-des-octets-aléatoires-en-blocs-de-nombres-sans-affaiblir-l'entropie fournit quelques solutions, mais le circuit redstone concret pour rejeter les sorties qui sont trop élevées et essayer à nouveau n'est pas fourni par cette réponse : c'est seulement théorique. Mais il fournit un aperçu de la façon de le faire : simplement rejeter les entrées hors gamme préserve l'entropie.
En pratique, Comment construire un décodeur binaire-décimal de deux bits en utilisant Redstone ? peut vous aider à décoder la sortie. La réponse acceptée peut faire correspondre n'importe quelle entrée à n'importe quelle sortie ; elle est facilement reprogrammable et adaptable si vous avez élaboré la table de vérité souhaitée. Ainsi, si l'on veut une sortie de 0 à 5, il faut utiliser 3 entrées, écarter 101, 110. 111
(ou connectez ces sorties à une bascule "try-again"), et mappez comme suit :
n
x
1
000
2
001
3
010
4
011
5
100
En regardant simplement la rangée, nous saurions que d5 = b1 & !b2 & !b3
; il fonctionne comme une table de vérité pour le décodeur souhaité.
Des chiffres plus importants
Lorsqu'il s'agit de nombres beaucoup plus grands, un tel décodeur deviendrait encombrant, trop grand pour que le jeu puisse le gérer. L'astuce consiste à utiliser un comparateur binaire ; faire votre filtrage en binaire, puis décoder le résultat si vous le souhaitez. Voir cette question sur la construction d'un comparateur 4 bits (actuellement un problème ouvert sur ce site, bien que des vidéos puissent être trouvées, mais elles sont généralement mal expliquées au-delà de "placer des blocs comme ceci"). Ceux-ci peuvent être mis en cascade pour créer des comparateurs de plus en plus grands (4, 8, 12, 16, ...). Voir cette ressource sur la façon de les connecter.
Explications
Cette question ; Comment puis-je randomiser la sortie d'un circuit Redstone ? posée en 2011, comporte de nombreux doublons ou quasi-doublons. Ils ont été fermés récemment (ces deux dernières années). Plusieurs de ces doublons sont eux-mêmes des doublons, fermés lors d'une précédente chasse aux doublons, qui sont eux-mêmes des doublons...
![recursion]()
La plupart de ces questions "en double" ont des réponses de qualité. En fait, les ancienne réponse à la question réside en fait en partie dans l'un des duplicatas. En outre, l'ancienne réponse concernait une version très ancienne du jeu : il existe de multiples solutions plus récentes qui constituent effectivement une meilleure réponse.
La plupart des "solutions" ne sont pas vraiment des solutions complètes. Pour ma part, je ne ferais certainement pas confiance à un fichier de certificat généré avec ces RNG de Minecraft. Les gens construisent toutes sortes de jeux dans Minecraft. Un générateur de nombres aléatoires est un concept de base important en programmation. Malheureusement, Minecraft ne fournit pas un accès direct à un RNG approprié sans mods/plugins ; la plupart des hacks suggérés comme solutions ne répondent pas à certains ou même à tous les tests de randomisation requis pour la chose que le lecteur a à l'esprit. Il y a une certaine nuance dans les mathématiques ici, et certains de vos problèmes vont avoir besoin de définitions plus (ou moins) strictes de l'aléatoire.
Quelques exemples : Un jeu de cartes, comme le blackjack, doit pouvoir compter sur un mélange bien organisé et non prévisible (de sorte que le fait de savoir que la pile de défausse est "lourde" n'a pas d'incidence sur les nouveaux tirages). Les dés doivent être réguliers (tous les chiffres ont la même probabilité). Les codes d'accès générés doivent être résistants à la devinette (Crypto-Secure). Etc etc. Voici un diagramme de Venn pour illustrer ce que je veux dire :
![Random generator types]()
Cette question a donc plusieurs réponses : les tests que vous devez réussir dépendent des éléments suivants ce que vous voulez faire avec vos numéros aléatoires. Plusieurs types de solutions peuvent donc être applicables. Ainsi, la plupart des réponses bien écrites apportent leur propre valeur ajoutée. Ainsi, la compilation des réponses en un seul endroit (au lieu de devoir fouiller dans de multiples couches de doublons) est également précieuse.
Mais il n'y a pas que des mauvaises nouvelles : Minecraft dispose d'une simulation d'électricité quelque peu idéosyncrasique et boguée, et les circuits logiques électriques peuvent donc être modélisés dans une certaine mesure. Les ordinateurs sont essentiellement des circuits logiques électroniques. en théorie vous pouvez construire n'importe quel PRNG : Minecraft est turing-complet . Dans la pratique, ils finiront par être trop lents pour être utilisables pour la solution que vous avez prévue (essayez de programmer disons MT19937 dans la redstone), et trouver une certaine abstraction fuyante (à travers laquelle Minecraft expose directement un PRNG bien programmé à partir du langage de programmation) est la méthode préférée pour s'attaquer à ce problème omniprésent.