Zahlen in zufälliger Reihenfolge

CDW

0
Mitarbeiter
(eingereicht von Nimda05)
Ziel: alle Zahlen von 0000 bis 9999 in zufälliger Reihenfolge in einer TXT Datei speichern, wobei sich die Zahlen aber nicht wiederholen dürfen (sonst wäre es zu einfach ;) )
Bsp:

1234
2345
0001
9991
usw.
 
AHK:
Code:
loop, 9999
  sList := sList . a_index . "|"

  Sort, sList, Random Z D|
  
 loop, parse,  sList, |
    fileappend, %a_loopfield%`n, result.txt
  
  msgbox File createt.
:D
 
theoretisch gut. praktisch leider noch nicht ganz ausgereift ;-)

zahlen wie "529" sind nicht erlaubt. es sollte heißen 0529 ;)
also immer 4-stellig das ganze
 
Naja. Ist ja keine Hexerei mehr. :rolleyes:

Das gibt noch eine If abfrage, dann ist das gefixt. mom... ;)

EDIT:

Code:
loop, 9999
  sList := sList . a_index . "|"

  Sort, sList, Random Z D|
  
 loop, parse,  sList, |
 {
  
    if strlen(a_loopfield) = 1
      newLine := 000 . a_loopfield
    Else if strlen(a_loopfield) = 2
      newLine := 00 . a_loopfield
    Else if strlen(a_loopfield) = 3
      newLine := 0 . a_loopfield
    Else if strlen(a_loopfield) = 4
      newLine := a_loopfield
    
    fileappend, %newLine%`n, result.txt
    
 }
msgbox File createt.
Könnte man noch eleganter lösen, aber ich bin grad aufm Sprung :)
 
Schau nochmal das erstes Posting von mir in diesem Thread an.... :D
 
RE: Zahlen in zufällgier Reihenfolge

Hier ist auch meine Lösung in Groovy

Code:
List list = []
for (n in 0..9999) { list.add(String.format("%04d", n)) }
Collections.shuffle(list)
BufferedWriter out = new File("numbers.txt").newWriter()
list.each { out.writeLine(it) }
 
Code:
php -r 'for($i=0;$i<10000;$i++)$a[]=$i;shuffle($a);foreach($a as $b)echo str_pad(0,4,$b)."\n";'>numbers.txt

Ganz schön beknackt :D

[EDIT]
Noch ein bisschen kürzer
Code:
php -r '$a=range(0,10000);shuffle($a);foreach($a as $b)echo str_pad(0,4,$b)."\n";'>numbers.txt
 
Code:
#!/usr/bin/perl
srand;@new = (); @old = 1 .. 9999;for( @old ){my $r = rand @new+1;push(@new,$new[$r]); $new[$r] = $_;}printf "@new\n";
 
In C++ ist das ganze schon ein wenig komplizierter...
Code:
#include <fstream>
using namespace std;

int main()
{
    ofstream out("./numbers.txt");
    int nums[10000];

    // Fill the numbers array
    for (int i = 0; i < 10000; ++i) {
        nums[i] = i;
    }

    // Sort it by random
    srand(time(0));
    for (int i = 0; i < 10000; ++i) {
        int moveto = rand() % 10000;
        int tmp = nums[moveto];
        nums[moveto] = nums[i];
        nums[i] = tmp;
    }

    // Now put it in the text file
    for (int i = 0; i < 10000; ++i) {
        out.fill('0');
        out.width(4);
        out << nums[i] << '\n';
    }
}
 
Eydeet hats eigentlich schon angewandt, aber hier nochmal eine shuffle-Funktion für int-Arrays in C.

Code:
void shuffle(int *data,int count)
{    
     int pos1,pos2,temp;    
     for(int i=0;i<count;i++)
     {
             pos1=rand()%count;
             pos2=rand()%count;
             temp = data[pos1];
             data[pos1]=data[pos2];
             data[pos2]=temp;            
     }
}
 
Python:
Code:
from random import choice
z = range(10000)
f = file('zahlen.txt', 'w')
while z:
    r = choice(z)
    z.remove(r)
    f.write('%0.4i\n' % r)
f.close()
 
Code:
#!/usr/bin/env ruby
f = File.new("range.txt", "w+");
ret=[];10000.times {|x| ret<<"0"*(4-x.to_s.length)+x.to_s;};
f.write(ret.sort_by{rand}.join("\r\n"));f.close
 
Code:
#!/usr/bin/env perl
use List::Util 'shuffle';
foreach (shuffle(0..9999)) {printf "%04d ", $_}
Gibt das Ergebnis auf stdout aus. 'n filehandle öffnen und explizit beim printf angeben statt des impliziten STDOUT wäre ja jetzt auch keine Kunst mehr...

Code:
#!/bin/bash
arr=()
randInt=$((RANDOM%10000))
for number in {0..9999}; do
   while [[ "${arr[randInt]}" ]]; do 
      randInt=$((RANDOM%10000))
   done
   arr[$randInt]=$number
done

printf "%04d\n" "${arr[@]}" > numbers
Das Ding dauert zwar ewig ('n paar Minuten, hängt auch ein wenig vom Zufall ab...), ist dafür aber pur Bash. (Nur builtins verwendet.)
 
Nochmal Python:
Code:
from random import shuffle
z = range(10000)
shuffle(z)
f = open("zahlen.txt", "w")
f.write("\n".join("%0.4i" % i for i in z))
f.close()
 
Mit STL gehts etwas kürzer.
Code:
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>

using namespace std;

int inc() { static int i = 0; return i++; }
void out(int i) { cout << setw(4) << setfill('0') << i << endl; }

int main()
{
	srand(time(0));
	vector<int> v(10000);
	generate(v.begin(), v.end(), inc);
	random_shuffle(v.begin(), v.end());
	for_each(v.begin(), v.end(), out);
}
Und kommt dann mal c++0x mit den lambda-fkt, gehts noch kompakter ;)
 
Zurück
Oben