2012-01-25 4 views
0

par exemple: 1589745896214758962147852.générer un nombre aléatoire de longueur 25

Ceci est une question que je turbiné pendant un certain temps maintenant. Quels sont les moyens possibles? Quelle est la meilleure pratique?

+0

Il peut être un nombre négatif. – Kameron

+2

Puis générez le signe aussi. –

+0

Est-ce que cela exclut les numéros de moins de 25 chiffres? – Clifford

Répondre

1

Ceci est une bonne question ...

Vous pouvez utiliser OpennSsl BIGNUM.

Ceci est un exemple fatorial simple.

#include <stdio.h> 
#include <openssl/bn.h> 

int main(int argc, char **argv) 
{ 
    BIGNUM *fat; 
    BN_ULONG a, f; 
    char *resp; 
    int i; 

    fat = BN_new(); 

    for (i = 1; i < argc; i++) { 

     f = atoll(argv[i]); 

     BN_dec2bn(&fat, "1"); 
     for (a = 2; a <= f; a++) { 
      BN_mul_word(fat, a); 
     } 

     resp = BN_bn2dec(fat); 

     printf("Fatorial of %s = %s\n", argv[i], resp); 
    } 
    return 0; 
} 

Je viens dicovered un meilleur exemple:

#include <stdio.h> 
#include <openssl/bn.h> 

int main(int argc, char **argv) 
{ 
    BIGNUM *fat; 
    char *resp = NULL; 

    fat = BN_new(); 

    BN_generate_prime(fat, 80, 1, NULL, NULL, NULL, NULL); 

    resp = BN_bn2dec(fat); 

    printf("Big Random Value: %s\n", resp); 

} 

;)

7

Vous pouvez simplement appeler le générateur de nombres aléatoires 25 fois pour chaque chiffre - simple si vous voulez que cela soit une chaîne.

Si vous n'avez pas de fonction de nombre aléatoire disponible, il y en a une simple à implémenter. enter image description here

http://xkcd.com/221/

+2

points de bonus pour les références xkcd? –

+0

N'attribue pas de matériel protégé par copyright vous obtenez des points !? – Clifford

+0

@Clifford c'est cc non-commercial (même que SO), mais le cache d'image SO supprimé le lien dans l'image, donc j'ai ajouté un –

1

Vous devrez faire face à une chaîne permettant d'enregistrer votre numéro.

Parce que le long long min signé est -9223372036854775808 et max est 9223372036854775807.

1589745896214758962147852 est beaucoup plus longue.

0

Votre problème est mal défini (au moment de l'écriture).

Si vous avez besoin exactement de 25 chiffres, vous pouvez simplement itérater 25 fois en obtenant un nombre aléatoire de 0 à 9 et en les compilant en une chaîne de caractères.

Si elle doit être un 25 nombre de chiffres (à savoir 10 < = r = -1) au lieu de 25 chiffres aléatoires puis le premier chiffre doit> = 1 (pas de zéros de gauche). Si vous avez besoin de ces chiffres pour représenter une valeur entière, sur laquelle vous pouvez effectuer des opérations arithmétiques, plutôt qu'une chaîne de chiffres, alors vous n'aurez pas de chance avec les types de données intégrés de C sur toute plate-forme probable depuis le la valeur nécessitera au moins 85 bits (10/log (2)).

Vous pouvez créer une représentation de 85 bits en concaténant les bits renvoyés par un générateur de nombres aléatoires standard dans un tableau d'octets. Si vous utilisez la fonction standard de la bibliothèque C, vérifiez la valeur RAND_MAX de votre implémentation; certaines implémentations ne génèrent que 16 bits, donc il faut faire attention à les concaténer car ce n'est peut-être pas un mot entier de bits aléatoires. Cependant, pour manipuler arithmétiquement un tel nombre, vous devrez créer des fonctions arithmétiques pour le faire aussi (ou utiliser une bibliothèque "bignum").

Questions connexes