Bud fra igår...
Det er ikke sidste gang vi skal afholde en kode konkurrence som denne - sikke mange gode bud! Fantastisk folkens...
Lad os starte ud med det længste bud som kommer fra Klaus Hebsgaard
//Klaus Hebsgaard
public static string GetRandomString( int count )
{
Dictionary<int, string> entries = GetList();
StringBuilder sb = new StringBuilder();
for( int i = 0; i < count; i++ ) {
int milli = DateTime.Now.Millisecond;
string firstMilli = milli.ToString();
Thread.Sleep( 21 );
sb.Append( entries[ milli ] );
}
return sb.ToString();
}
public static Dictionary<int, string> GetList()
{
List<string> entries = new List<string>();
entries.Add( "A" );
entries.Add( "B" );
entries.Add( "C" );
entries.Add( "D" );
entries.Add( "E" );
entries.Add( "F" );
entries.Add( "G" );
entries.Add( "H" );
entries.Add( "I" );
entries.Add( "J" );
entries.Add( "K" );
entries.Add( "L" );
entries.Add( "M" );
entries.Add( "N" );
entries.Add( "O" );
entries.Add( "P" );
entries.Add( "Q" );
entries.Add( "R" );
entries.Add( "S" );
entries.Add( "T" );
entries.Add( "U" );
entries.Add( "V" );
entries.Add( "X" );
entries.Add( "Y" );
entries.Add( "Z" );
entries.Add( "Æ" );
entries.Add( "Ø" );
entries.Add( "Å" );
entries.Add( "0" );
entries.Add( "1" );
entries.Add( "2" );
entries.Add( "3" );
entries.Add( "4" );
entries.Add( "5" );
entries.Add( "6" );
entries.Add( "7" );
entries.Add( "8" );
entries.Add( "9" );
List<string> newEntries = new List<string>();
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
newEntries.AddRange( entries );
return ToDict( newEntries );
}
private static Dictionary<int, string> ToDict( List<string> list )
{
Dictionary<int, string> dict = new Dictionary<int, string>();
for( int i = 0; i < list.Count; i++ ) {
dict.Add( i, list[ i ] );
}
return dict;
}
Også tager vi dem i en lind strøm...
Brian Rasmussesn kom med følgende bud:
//Brian Rasmussen
public static string RandomString( uint length )
{
var buffer = new char[ length ];
var timer = new Stopwatch();
timer.Start();
for( var i = 0; i < length; i++ ) {
buffer[ i ] = (char)( 32 + timer.ElapsedTicks % ( length + i ) );
}
return new string( buffer );
}
Også skal vi lige forbi Pernille Poulsen der kom med dette bud:
static string RandWithoutRand( Int32 length )
{
StringBuilder sb = new StringBuilder();
for( Int32 i = 0; i <= length; i++ ) {
//Et "tilfældigt" hex-tal trylles frem:
string hex = Guid.NewGuid().ToString().Substring( 1, 2 );
//Hexværdien udtrykt i int 16. Tager modulus 25 og lægger 97 til for at få acsii værdierne 97-122 (små bogstaver)
int hexvalue = ( Convert.ToInt32( hex, 16 ) % 25 ) + 97;
// Det tilsvarende tegn
char charValue = (char)hexvalue;
sb.Append( charValue );
}
//og taaa-naaa en tilfældig streng:
return sb.ToString();
// <:O) God jul
}
Niklas Petersen har skrevet følgende klasse:
//Niklas Petersen
public class RandomString
{
private const uint a = 1664525;
private const uint c = 1013904223;
private const uint m = uint.MaxValue;
private uint next;
public RandomString()
{
next = (uint)Environment.TickCount;
}
private double Rand()
{
/* Linear congruential generator */
next = next * a + c % m;
return next * ( 1.0 / m );
}
public string GetText( int length )
{
string t = string.Empty;
for( int i = 0; i < length; i++ )
t += (char)( 65 + Rand() * 25 );
return t;
}
}
Og det sidste bud Rasmus Larsen:
//Rasmus Larsen
public static string Generate( int length )
{
var result = string.Empty;
var alphabet = "abcdefghijklmnopqrstuvwxyzæøå";
// Base our randomness on time
var randomSeed = DateTime.Now.Ticks;
for( var i = 0; i < length; i++ ) {
// Generate a random number within the length of the alphabet string.
var randomNumber = (int)( randomSeed % alphabet.Length );
result += alphabet[ randomNumber ];
// "Randomize" our seed and make sure it's positive.
randomSeed *= 13;
randomSeed = Math.Abs( randomSeed );
}
// Ensure that we don't get the name number of ticks if calling
// the function repeatedly. Could use a static integer in the
// class too, but this is contained within the function.
Thread.Sleep( 1 );
return result;
}
Det er svært at sige hvem der skal vinde den her, så derfor grubler jeg lige et par timer og vender tilbage...
Comments
Anonymous
December 15, 2008
Jeg vil lige sige, mit kode er ubetinget det ringeste af budene. Det tog ca. 20 min at flække samme med hovedet under armen... Egentlig er det imod mine principper at lave noget kode af den standard, men principper er jo til for at blive brudt.Anonymous
December 16, 2008
Så vidt jeg kan vurdere efter at have kigget fem minutter på de forskellige forslag, har Niklas fortjent at vinde, da alle de andre forslag benytter sig af enten systemuret eller Guid som random number generators, og det er både snyd og danner normalt ikke sekvenser, der tilnærmer sig kendte stokastiske fordelinger. Jeg skal ikke kunne vurdere om Niklas' forslag danner near-random sekvenser, men i det mindste har han gjort sig umage og skrevet en generator i stedet for blot at håbe på at system-uret gør arbejdet for ham (hvilket det ikke gør). Bemærk i øvrigt at selv System.Random ikke danner sekvenser, der er særligt random...Anonymous
December 16, 2008
Well, du har da ret i, at man nok ikke skal implementere en krypteringsalgoritme på de forslag, men læg mærke til at Daniels tekst faktisker siger "random". Det tolkede jeg som halvtilfældig og til det formål, mener jeg at alle løsningerne er gode nok, men det er jo selvfølgelig Daniels afgørelse.Anonymous
December 16, 2008
Jævnfør Dilbert striben, jeg linkede til i indlægget, overvejede jeg faktisk at lave en metoder, der bare returnerede x antal 9-taller. Hvem kan sige om de andre random rutiner er bedre :-)Anonymous
December 16, 2008
OK, jeg føler mig rimelig dum - efter at have læst Rasmus' indlæg har jeg skåret min kode ned til 14 linjer, og den tager endda store bogstaver med: public static string GetRandomString(int count) { var alphabet = "abcdefghijklmnopqrstuvwxyzæøåABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ123456789"; StringBuilder sb = new StringBuilder(); for(int i = 0;i < count;i++) { int milli = DateTime.Now.Millisecond; int firstMilli = milli % alphabet.Length; Thread.Sleep(21); sb.Append(alphabet[firstMilli]); } return sb.ToString(); }Anonymous
December 16, 2008
@ ploeh Niklas' kode bruger da også systemuret :-) (eller så godt som): next = (uint)Environment.TickCount;Anonymous
December 16, 2008
Jo, men det er kun som seed - ikke som generator.Anonymous
December 16, 2008
Orv, det må sørme være en svær beslutning. Nu er det da ret mange timer, som Daniel efterhånden har brugt på at gruble.... Hvorfor ikke finde en tilfældig vinder, det må da være helt i konkurrencen ånd :o) <:o) God jul! /Pernille