élément aléatoire de la matrice en c

Comment puis-je sélectionner un élément au hasard dans un tableau de caractères en c ?

Par exemple:

char *array[19];

array[0] = "Hi";


array[1] = "Hello";

etc

Je suis à la recherche de quelque chose comme array[rand], où rand est le hasard nombre entier compris entre o et de la longueur du tableau(dans ce cas, 20) comme 1, 2, 3 , 19, etc.

  • Vous êtes à la recherche après rand()
  • essayez array[(int) (20 * rand())] où 20 est la longueur du tableau.
  • où 20 est la longueur du tableau, je suppose?
  • peut-être char* array[20];
  • Crud, oublié c'est C - le besoin à l'échelle rand() par l'entier maximum.
  • Donc, pour être clair, 20 * rand() n'est pas correct. Utilisation rand() % 20. Toutefois, si votre tableau est de 20 éléments de temps vous avez besoin pour réparer votre déclaration de variable! Vous êtes seulement à l'allocation de 19 éléments.
  • Non, ne pas utiliser % car les résultats peuvent être non-uniforme. La multiplication d'un U(0,1) de la valeur temps de 20 et le revêtement de sol donnera un entier de 0 à 19 ans, c'est à dire, de 20 éléments, tous ensemble pour base zéro indices de tableau.
  • Votre exemple des affectations ne fonctionnera pas; ce que vous êtes à la définition d'un tableau de caractères, pas des chaînes de caractères.
  • Le tableau doit être un pointeur, l'a obtenu.
  • Ce que @pjs est en vous référant à ce problème est-il de l'linux homme pages: "Les versions de rand() et srand() dans le Linux de la Bibliothèque C utiliser le même générateur de nombre aléatoire random(3) et srandom(3), de sorte que les bits de niveau inférieur doit être aussi aléatoire que le plus élevé de bits d'ordre. Cependant, sur les anciens rand() de mise en œuvre, sur les implémentations actuelles sur les différents systèmes, les bits de niveau inférieur sont beaucoup moins aléatoire que l'ordre supérieur bits. N'utilisez pas cette fonction dans les applications destinées à être portable, quand le bien de l'aléatoire est nécessaire. (Utilisation aléatoire(3) à la place.)"
  • Si il y a une inquiétude sur la qualité de l'aléatoire rand() est probablement pas le meilleur GÉNÉRATEUR d'utiliser en premier lieu. À l'aide de rand(), mais en divisant par RAND_MAX, puis à l'échelle par 20.0, puis la tronquant, est un compromis entre le confort et la qualité qui accomplit ni.
  • Ma citation suggère que, si votre plate-forme fournit random() il peut être mieux que rand() si vous êtes à l'aide de la % méthode (et aussi goos comme l'aide (int)(U(0,1)*20).
  • rand()/RAND_MAX = 0, car ils sont tous les deux ints. Vous êtes mieux de multiplier par 20.0 abord, puis en divisant par RAND_MAX.
  • C'est vrai, mon phrasé était bâclée. En tout cas, mon point est que si vous vous souciez assez sur la qualité pour ce faire, vous voudrez probablement utiliser une meilleure PRNG (comme random si elle est disponible sur votre plate-forme).
  • Non, pjs se réfère au fait que rand() % 20 n'est pas exactement le modèle d'une distribution uniforme si RAND_MAX est pas un de moins qu'un multiple de 20. Certaines valeurs sont plus susceptibles que les autres. Comparer avec de rouler des dés à 6 faces et en prenant le résultat modulo 5: résultats possibles sont 1,2,3,4,0,1. 1 est deux fois plus susceptibles que les autres résultats.
  • Si c'est le parti pris qu'il parle, puis mise à l'échelle rand() de U(0,1) puis à l'échelle par 20 ne va pas aider - Par le casier principe que vous obtenez exactement la même quantité de partialité. Le biais dû à ce < (20/RAND_MAX) et depuis la norme garantit RAND_MAX > 32767 vous êtes à la recherche à un maximum de polarisation de moins de 0,06%. ( 32760 valeurs se produire 1638 fois, et 7 valeurs se produire 1639 fois). Si ce biais est trop grand pour vous (et votre RAND_MAX=32760), vous devez rejeter ces 7 valeurs (rejet de prélèvement - qui est impartial), ou de combiner plus d'un appel à rand() pour obtenir de plus "aléatoire" bits.