Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Zufaelligen Buchstaben erzeugen

6 views
Skip to first unread message

Martin Lemke

unread,
Mar 7, 2011, 7:09:29 AM3/7/11
to
Ich dachte die Aufgabe sei einfach:

$k="bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ1"; // Konsonanten

$zufall=$k[mt_rand(0, count($k)-1)];

Aber ich bekomme in jedem Durchlauf 'b' geliefert. Ich habe mir etwas
zufälligere Ergebnisse erhofft.

Was mache ich falsch?

Martin

Karl Pflästerer

unread,
Mar 7, 2011, 7:22:42 AM3/7/11
to
Martin Lemke <use_delet...@maaaddin.de> writes:

count() ist für Arrays oder Objekte. Du suchst strlen().

KP

0liver '0lzo' Seyfert

unread,
Mar 7, 2011, 7:22:26 AM3/7/11
to

Moegliche Antworten:

a) es kommt _zufaellig_ immer "b" ;-)

b) einen String mag man als Array von Chars betrachten, praktischerweise
wuerde ich aber strlen() statt count() nehmen und substr() statt $k[..]

Also: $zufall=substr($k,mt_rand(0, strlen($k)-1), 1);

:-)
Oliver


P.S. Bei PHP vor 4.2 haette ich sonst noch auf srand() hingewiesen.

Martin Lemke

unread,
Mar 7, 2011, 7:39:41 AM3/7/11
to
Karl und Oliver schrieben übereinstimmend:

> count() ist für Arrays oder Objekte. Du suchst strlen().

Dieser Fehler ist bei mir unausrottbar. *grrr*

@Oliver:

$string[$i] geht durchaus. Aber substr natürlich auch, wenngleich ohne
irgend einen Vorteil und schon gar nicht hinsichtlich der Lesbarkeit.

Danke!

Martin

Ethan Sharps

unread,
Mar 7, 2011, 7:41:23 AM3/7/11
to
On 07.03.2011 13:22, 0liver '0lzo' Seyfert wrote:

> Moegliche Antworten:
>
> a) es kommt _zufaellig_ immer "b" ;-)

:-)

> praktischerweise
> wuerde ich aber strlen() statt count() nehmen

Nicht nur praktischer Weise, es geht nicht mit count().

> und substr() statt $k[..]

Das hingegen ist Quatsch. Die Zeichen der Zeichenkette liegen ganz klar
im ASCII-Bereich da ist $k[$index] absolut der performantere Weg und der
Zugriff im Arrayformat hat dann auch keinerlei Nachteil.

> Also: $zufall=substr($k,mt_rand(0, strlen($k)-1), 1);

$zufall = $k[\mt_rand(0, \strlen($k) - 1)];

Gruß, Ethan

Harald Stowasser

unread,
Mar 8, 2011, 6:04:38 AM3/8/11
to

Eventuell interessiert dich der Codeschnippsel hier. Ich hab den vor
Jahrtausenden mal irgendwo gefunden. Der kaputte dokumentations Kopf
zeigt das der code bei mir nicht produktiv, aber dennoch interessant ist.


/* $PwdType can be one of these:
test .. .. .. always returns the same password = "test"
any .. .. .. returns a random password, which can contain
strange characters
alphanum . .. returns a random password containing
alphanumerics only
standard . .. same as alphanum, but not including l10O (lower
L, one, zero, upper O)
*/
function getRandomPassword($PwdLength=8, $PwdType='standard')
{
$Ranges='';
if('test'==$PwdType) return 'test';
elseif('standard'==$PwdType)
$Ranges='65-78,80-90,97-107,109-122,50-57';
elseif('alphanum'==$PwdType) $Ranges='65-90,97-122,48-57';
elseif('any'==$PwdType) $Ranges='40-59,61-91,93-126';

if($Ranges<>'')
{
$Range=explode(',',$Ranges);
$NumRanges=count($Range);
$pr_bits='';
if( ini_get('safe_mode') ){
mt_srand(time());
}else{
$ran_string=shell_exec("head -c 4 /dev/{$u}random");
$random=ord(substr($ran_string,0,1))<<24 |
ord(substr($ran_string,1,1))<<16 |
ord(substr($ran_string,2,1))<<8 |
ord(substr($ran_string,3,1));
mt_srand($random);
}

$p='';
for ($i = 1; $i <= $PwdLength; $i++)
{
$r=mt_rand(0,$NumRanges-1);
list($min,$max)=explode('-',$Range[$r]);
$p.=chr(mt_rand($min,$max));
}
return $p;
}
}


0 new messages