Creazione di una stringa casuale di *numero* caratteri

Stato
Discussione chiusa ad ulteriori risposte.

Robertof

Utente Silver
19 Giugno 2008
186
10
0
98
Ciao a tutti, stavolta vi propongo io un esercizio molto semplice.
Creare, nel proprio linguaggio preferito, un programma che generi una stringa casuale di *numero* caratteri (scelti dall'utente, di predefinito dieci).
Ecco il mio:
PHP:
function generate_random_string($len=10) {
	$a=str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',1);
    $ritorna='';
    for($i=0;$i<=$len;$i++){
        $ritorna .= @$a[rand(0,count($a))];
    }
    return $ritorna;
}
echo generate_random_string(); // Genera una stringa di 10 caratteri
echo '<br />'.generate_random_string(22); // Genera una stringa di 22 caratteri
Bye
Edit: nuova versione ^^
 
La fai facile te in php xD
baccati sto c++
Codice:
#include <iostream>
#include <ctime>

using namespace std;

int main(){

    srand(time(0));
    int lstring; //Lunghezza stringa

    //Creazione e inizializzazione dell'array con le lettere casuali.
    char letters[52];
    int i1=65, i2=97;
    for( int i=0; i<26; ++i ){
        letters[i] = (char)i1;
        ++i1;
    }
    for( int i=26; i<122; ++i ){
        letters[i] = (char)i2;
        ++i2;
    }

    cout<<"Inserire lunghezza stringa casuale: ";
    cin>>lstring;
    char cstring[lstring]; //stringa casuale

    //Genrazione della stringa casuale
    for( int i=0; i<lstring; ++i ){
        int cas=(rand()%52);
        cstring[i]=letters[cas];
    }

    //Stampa della stringa
    for (int i=0; i<lstring; ++i ){
        cout<<cstring[i];
    }

getchar();
return 0;
}

E ho usato le tabelle ascii con il casting forzato per ottenere tutti i caratteri dell'alfabeto ^^

EDIT:
PHP:
    if ($len > count($a)) {
                return false;
    }
Perchèmmai ciò?
 
ecco:
Codice:
#!/usr/bin/perl
print "lunghezza stringa: ";
$length = <stdin>;
@chars=('a'..'z','A'..'Z','0'..'9');
for ($i=0;$i<$length;$i++) {
$string .= $chars[rand @chars];
} 
print "Random generated string: $string\n\n";

avrei preferito un modo elegante usando random value da 33 a 126, ma non trovo un modo preciso uhm...
 
io ho utilizzato un approccio un po' diverso dal vostro (in java chiaramente):
Codice:
public void generatore(int n){
        int c=10,a;
        String s="";
        if(n!=0){c=n;}
        do{
            a=(int)(Math.random()*123);
            if(a>=48 && a<=57 | a>=65 && a<=90 | a>=97 && a<=122){s+=(char)a;}
        }while(s.length()<c);
        System.out.println(s);
    }

quello con una stringa contenente i caratteri da utilizzare:
Codice:
public void generatore(int n){
        int c=10;
        if(n!=0){c=n;}
        String s="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",v="";
        for(int i=0;i<c;i++){
           v+=""+s.charAt((int)(Math.random()*62));
       }
        System.out.println(v);
    }
 
Il tuo razor sa un po' di bruteforce.... oppure non l'ho capito io, dato che non conosco molto java....
 
la riga
Codice:
a=(int)(Math.random()*123);
genera un numero casuale tra 1 e 123,poi l'if controlla se il numero appena generato rientra nei valori ascii accettati,se è un valore accettato concatena alla stringa il relativo carattere e alla fine del do-while (che cicla finchè la condizione è vera) stampa la stringa generata.
 
Appunto, perchè non fai due rand? Cioè di 123 sono validi solo (26*2=52) caratteri, è un bello spreco di elaborazione....
 
_619_ ha detto:
PHP:
    if ($len > count($a)) {
                return false;
    }
Perchèmmai ciò?
Perché verifica se la lunghezza inserita è maggiore dei caratteri disponibili.
 
Ma non ha senso, così la stringa non può essere maggiore nel numero di caratteri dell'alfabeto, e nel testo non c'è scritto che nessun carattere non debba ripetersi....
 
Se ho capito cosa intendi:
[Python]
Codice:
#!/usr/bin/python
from random import randint
chars=list('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
length=int(raw_input("Inserisci la lunghezza della stringa: "))
global word
word=list()
if not length:
    length=10
for i in xrange(0, length):
    char=randint(0, len(chars))
    word.append(chars[char])
print ''.join(word)
 
Python:
Codice:
from sys import argv
from random import randint
length=int(argv[1])
charset=tuple('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
result=''
for i in xrange(length):
	result+=charset[randint(0,len(charset))]
print result
 
opocaj, perchè inserisci quei global nel codice?

cmq in poco spazio ecco qui:
Codice:
from random import randint; from string import letters,digits
p=""
for i in range(0,int(raw_input("Quante lettere? "))):
    p+=(letters+digits)[randint(0,62)]
print p
 
Malex ha detto:
opocaj, perchè inserisci quei global nel codice?

cmq in poco spazio ecco qui:
Codice:
from random import randint; from string import letters,digits
p=""
for i in range(0,int(raw_input("Quante lettere? "))):
    p+=(letters+digits)[randint(0,62)]
print p

noooooooo, un punto e virgola in uno script python! Cosa i miei occhi devono vedere!

[sarcastic mode = OFF]
 
Mia modesta soluzione in python:
Codice:
#!/usr/bin/python
from random import randint;
def Random(n=10):
	tmp = [];
	for i in range(0,n):
		tmp.append(chr(randint(97,122)));
	return ''.join(tmp);
print Random();
 
Versione minimeh:
Codice:
(function(n){var str = new String; n.times(function(){var ch; while (!(ch = parseInt(Math.random()*127).toChar()).test(/[0-9A-Za-z]/)); str+=ch}); return str;})

Versione ad oggetti ma molto fru fru:
Codice:
#! /usr/bin/env ljs

RandomString = Class.create({
    constructor: function (length) {
        length       = length || 10;
        this._string = new String;

        length.times(function () {
            var ch;
            while (!(ch = int(Math.random()*127).toChar()).test(/[0-9A-Za-z]/));
            this._string += ch
        }, this);
    },

    methods: {
        toString: function () {
            return this._string;
        },
    },
});

print("Here, take this random string: " + new RandomString((arguments.length) ? arguments.shift().toNumber() : 10));
 
Vi va bene questo in C?
Codice:
#include <stdio.h>
#include <stdlib.h>

int main(void){
	int i,n,ran;
	char *str;
	printf("Lunghezza della stringa: ");
	scanf("%d",&n);
	if(n<10)
		n=10;
	str = (char*)calloc(n, sizeof(char));
	srand(n);
	for(i=0;i<n;i++){
		ran = (int) (rand()%62);
		ran+=65;
		if(ran>90) ran+=6;
		if(ran>122) ran-=75;
		str[i] = (char)ran;
	}
	printf("%s\n",str);
	return 0;
}
 
[ot]ciao shura ho provato a compilare ed eseguire il tuo (però ora sono su win) una volta inserito la lunghezza esce... ho inserito un getchar() sia prima che tu chiuda il for sia prima di return 0 ma nulla non funzia... [/ot]
 
prima del return 0; mettici un system("pause"); altrimenti mi è già capitato devi metterne un'altro prima della calloc...windows fa questo -.-
 
Il mio in php

PHP:
<?php
function random_string($lenght = 10) {
	$char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
	$shuffled = str_shuffle($char);
	return substr($shuffled, -$lenght);
	}
echo random_string() . '<br \>';
echo random_string(20);
?>

EDIT: Non avevo letto che la stringa doveva avere una lunghezza anche maggiore del numero dei caratteri disponibili... il mio script accetta massimo una lunghezza di 62.
 
ecco il mio in ruby fatto al momento
[new version] << In norma sta volta xD
Codice:
alfabeto = "q-w-e-r-t-y-u-i-o-p-è-a-s-d-f-g-h-j-k-l-z-x-c-v-b-n-m"
alfabeto = alfabeto.split("-")
alfabeto += alfabeto.join "-".upcase.split("-")
alfabeto += "1-2-3-4-5-6-7-8-9-0".split("-")
n = alfabeto.size
def getrandom(len = 10)
       x = 0
       while x <= len
               print alfabeto[rand(n)]
               x += 1
       end
end
 
Stato
Discussione chiusa ad ulteriori risposte.