Avatar billede ahara Nybegynder
05. august 2006 - 09:04 Der er 8 kommentarer og
1 løsning

Spørgsmål til random numre

Hvis jeg kalder en funktion som nedenstående får jeg samme tilfældige tal ved mindre jeg sætter et delay ind i funktionen hvor jeg kalder createTrainData(), nogen der ved hvordan jeg løser dette?

Tak
AHR

public void createTrainData()
{
        Random NewRand = new Random();
    double randNumber;

    for(int i=0; i<sizeX;i++)
    {
        randNumber[i] = NewRand.NextDouble();
        }
}
Avatar billede nielle Nybegynder
05. august 2006 - 09:18 #1
Ja, du bør ikke oprette et Random-objekt hver gang du kalder funktionen. Flyt den uden for, sådan at den kun oprettes en gang i alt:

private Random NewRand = new Random();
public void createTrainData()
{
    double randNumber;
    for (int i=0; i<sizeX; i++)
    {
        randNumber[i] = NewRand.NextDouble();
    }
}
Avatar billede nielle Nybegynder
05. august 2006 - 09:22 #2
Læs i øvrigt arne_v's artikler sådan at du har bedre chancer for at undgå den slags fælder en anden gang:

http://www.eksperten.dk/artikler/680
http://www.eksperten.dk/artikler/686
Avatar billede ahara Nybegynder
05. august 2006 - 12:25 #3
Sorry, men jeg havde også lagt NewRand uden for, desværre en copy paste fejl. Det virker dog stadig ikke og jeg skal stadig benytte en Thread.Sleep() imellem funktionskaldene før det virker.


private Random NewRand = new Random();

public void createTrainData()
{
    double randNumber;
    for (int i=0; i<sizeX; i++)
    {
        randNumber[i] = NewRand.NextDouble();
    }
}
Avatar billede nielle Nybegynder
05. august 2006 - 12:41 #4
Det burde nu virke uden problemer.

Et spørgsmpål: Du definere:

double randNumber;

- inde i funktionen. Samtidigt referere du til et array med samme navn:

randNumber[i] = NewRand.NextDouble();

Dette burde give dig en kompiler-fejl, sådan at faktisk du slet ikke kan køre din kode.

Den indre skal vist slettes for den har slet ingen funktion alligevel:

private Random NewRand = new Random();

public void createTrainData()
{
    for (int i=0; i<sizeX; i++)
    {
        randNumber[i] = NewRand.NextDouble();
    }
}
Avatar billede ahara Nybegynder
05. august 2006 - 12:44 #5
Hehe. Det er en forkortet udgave af min funktion. Burde nok have lagt det hele med. Den er vist også kopieret forkert ind kan jeg se - sorry
Avatar billede ahara Nybegynder
05. august 2006 - 12:53 #6
Her er hele min kode. Som du kan se opretter jeg et antal objekter af typen CReplicate og gemmer dem i et array. Hvis jeg benytter Sleep(10) virker det ellers fungerer det ikke.

public void loadPatternReplicates()
{
    for(int i=0; i<numberOfPatternReplicates; i++)
    {
        CReplicate NewTrainData = new CReplicate(patternData, gridSize);
        patternReplicates[i] = NewTrainData;
        //System.Threading.Thread.Sleep(10);
        }
}

public class CReplicate
{
    private int[] patternData;
    private int[] data;
    private int patternNumber;   
    private int gridSize;
    private Random NewRand = new Random();

    public CReplicate(int[] x_patternData, int x_gridSize)
    {
        patternData = x_patternData;
        gridSize = x_gridSize;
        data = new int[gridSize];
        createTrainData();
    }

    public void createTrainData()
    {
        double limit = (double)1/(double)8;
        double randNumber;
        int pixel;
        int counter=0;

        for(int i=0; i<gridSize;i++)
        {
            randNumber = NewRand.NextDouble();
            pixel = patternData[i];

            if(randNumber >= limit)
            {
                data[counter] = pixel;
            }
            else
            {
                data[counter] = 1;
            }
        counter++;
        }
    }

    public int[] getData()
    {
        return data;
    }
}
Avatar billede nielle Nybegynder
05. august 2006 - 12:58 #7
Ahh, ok: Du bør heller ikke have din:

private Random NewRand = new Random();

- på den måde inden i din CReplicate klasse. For så kaldes den jo en gang for hver gang at du opretter et nyt CReplicate-objekt. Den bør faktisk kun kaldes *en* gang totalt.

En mulig metode er at definere den som værende static:

private static Random NewRand = new Random();
Avatar billede ahara Nybegynder
05. august 2006 - 13:03 #8
Tusind tak. Det virker nu. Svar og der er point
Avatar billede nielle Nybegynder
05. august 2006 - 13:09 #9
Svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester