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

Zufaelligen Buchstaben erzeugen

13 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