2 votes

Comment distribuer aléatoirement un attribut sur un certain nombre d'objets ?

Je me demandais quelle était la meilleure façon de répartir quelque chose sur un nombre déterminé d'objets. J'essaie de créer un jeu de drague où il y a un certain nombre de tuiles et un nombre déterminé de mines, mais je ne suis pas sûr de la meilleure façon de distribuer aléatoirement des nombres sur une plage.

Concrètement, si j'avais un vecteur de disons 400 objets, quelle est la meilleure façon de distribuer aléatoirement un attribut booléen de sorte que 30 de ces 400 objets soient vrais et le reste faux ?

struct Tile {
  bool mine;
  // ...
};

std::vector<Tile> v(400);

Je pensais peut-être à quelque chose comme un système de probabilité où un nombre déterminé de mes tuiles devait absolument avoir l'attribut, et je pourrais créer un vecteur de numérotation de tous les objets et lancer des nombres aléatoires, puis retirer ces objets du vecteur jusqu'à ce que le nombre métrique de mines soit atteint.

0voto

bolov Points 4005

Générez le tableau avec la quantité définie de chaque valeur que vous voulez, puis mélangez-les.

https://en.cppreference.com/w/cpp/algorithm/random_shuffle

0voto

BBB Points 5
int N = 400;
int numMines = 30;
vector<bool> hasMine;
for(int i = 0; i < N; i++){
   if(i < numMines) hasMine.push_back(true);
   else hasMine.push_back(false);
}  
random_shuffle(hasMine.begin(), hasMine.end());

Si vous vous souciez trop de la précision de votre mélange, vous pouvez utiliser la méthode de mélange avec un générateur aléatoire séparé (en savoir plus à ce sujet aquí ). Mais cela devrait suffire pour un jeu simple.

0voto

cigien Points 11

Ce que vous essayez de faire ici est de transformer un sous-ensemble aléatoirement échantillonné du vecteur. Le site gamme-v3 la bibliothèque a views::sample qui peuvent être utilisés à cette fin :

for (auto & tile : v | ranges::views::sample(30))
    tile.mine = true;  

Voici un Démo .

Cette solution présente l'avantage de ne pas nécessiter de copies du vecteur, ni de mémoire supplémentaire. De plus, cette solution fonctionne sans déplacer aucun des objets du vecteur.

Il est prévu que cette vue soit ajoutée à C++23, bien qu'elle soit seulement Niveau 3 priorité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X