» »

[Java - DN] Naključna števila

[Java - DN] Naključna števila

Zixan ::

Kako bi vi generirali 7 random stevil na intervalu od 0 do 39 z uporabo arraya, ne da bi se st ponovile
  • spremenil: Mavrik ()

lebdim ::

v pascalu:
for i:=1 to 7 do 
t[i]:=random(40);

minusnič ::

Narediš seznam 40 zaporednih od 0 do 39. Nato zmiksaš in izpišeš.

V C-ju:
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
	char *a = (char *) malloc (39);

	for (size_t i = 0; i != 39;) {
		size_t i_1 = i + 1;
		a[i] = i_1;
		i = i_1;
	}

	for (size_t i = 0; i != 39; i++) {
		size_t r = rand() % 40;

		char a_1 = a[r];
		a[r] = a[i];
		a[i] = a_1;
	}

	for (size_t i = 0; i != 7; i++)
		printf ("%i ", a[i]);

	return 0;
}

lebdim ::

drugače pa, sam random ti ne zagotavlja, da se katera izmed števil ne bo ponovila. če se ponovi, pač ****ga ...

švrk ::

import java.util.ArrayList;

public class random {

    public static ArrayList<Integer> stevila(int min, int max) {
        ArrayList<Integer> rand = new ArrayList<Integer>();
        int range = (max - min) + 1;
        for (int i = 0; i < 7; i++) {
            int randomNum = (int) (Math.random() * range) + min;
            boolean obstaja = false;
            for (int j = 0; j < rand.size(); j++) {
                if (rand.get(j) == randomNum) {
                    obstaja = true;
                    break;
                }
            }
            if (obstaja) {
                i--;
            } else {
                rand.add(randomNum);
            }
        }
        return rand;
    }

    public static void main(String[] args) {
        ArrayList<Integer> rand = stevila(0, 39);
        for (int i = 0; i < rand.size(); i++) {
            System.out.println(rand.get(i));
        }
    }
}

bella_trix ::

public class RandomStevila {
	
	public static void main(String[] args) {
		
		int[] arr = new int[7];

		int counter = 0;
		
		arr[counter] = (int) (Math.random () * 39);
		
		while (counter != 6)
		{	
			if (checkIfAlready(arr[counter], counter, arr) )
				arr[counter] = (int) (Math.random () * 39) + 1;
			else
				arr[++counter] = (int) (Math.random () * 39) + 1;
		}
		
		for (int i = 0; i < arr.length; i++)
			System.out.print(arr[i] + " ");
		
	}
	
	public static boolean checkIfAlready (int x, int c, int[] a)
	{
		for (int i = 0; i < a.length; i++)
		{	
			if (i == c)
				continue;
			
			if (x == a[i])
				return true;
		}
		return false;
	}
}


Če potrebuješ dodatno razlago, reci.

minusnič ::

public static void main (String[] args) {
	int arr = new int[40];

	for (int i = 0; i != 40; i++)
		arr[i] = i + 1;

	for (int i = 0; i != 40; i++) {
		int tmp = arr[i];
		int u = rand.nextInt (40);

		arr[i] = arr[u];
		arr[u] = tmp;
	}

	for (int i = 0; i != 7; i++)
		System.out.print (arr[i] + " ");
}


Prejšnja odgovora sta lahko neomejena v smislu klicev Math.random ().

minusnič ::

Za splošni primer -- n neenakih števil od m do M (M - m manjši od n) -- bi pa uporabil tako rešitev, ki je neomejena v smislu klicev Math.random(), če bi bil n veliko manjši od M - m in n majhen bi uporabil zgoraj predlagano metodo, če bi bil n veliko manjši od M - m pa n velik bi uporabil hash za O (1) vpogled, če je neka vrednost že izbrana, če bi bil n približno enak M - m bi uporabil mojo rešitev.

Zgodovina sprememb…

technolog ::

minusič, to ni pravilno mešanje arraya.

Če ne znaš tega pravilno naredit, raje uporabi kakšno knjižnico.

minusnič ::

Ok, se oproščam za rešitev, v kateri ni vsaka kombinacija enako verjetna (http://blog.codinghorror.com/the-danger..., moral bi delati tako, da začnem na zadnjem elementu, gazamenjam z enim izmed n elementov (lahko tudi s seboj), potem pa šel na prejšnjega in ga zamenjal z enim izmed preostalih n - 1 (spet vključno s seboj) ... in tako do prvega elementa (ki itak lahko zamenjam le s samim seboj, kar je brezveze, in tam izstopim iz iteracije), in na koncu dobim vseh n! kombinacij enako zastopanih.

technolog ::

Točno tako. Odlično.

WhiteHat ::

Another sliky way after two years!

public static void main(String[] args) {
        
        int max=39,min=0,st=7,skipped=0;
        HashSet<Integer> HSI=new HashSet<>();
        ArrayList<Integer> ALI=new ArrayList<Integer>();
        
        while(HSI.size()<st) {
            int rand=(int)(Math.random()*(max-min+1)+min),size_a=HSI.size();
            skipped++;
            
            HSI.add(rand); //Undesirable HashSet sorting (it sorts 16 numbers..)
            if (size_a!=HSI.size()) {ALI.add(rand);}//  <- sorting dodge
        }//KONEC WHILE
        
        skipped=skipped-ALI.size();
        System.out.println("Redundant numbers count: "+skipped);
        
        for(Integer intt:ALI) {
            System.out.print(intt+",");
        }//KONEC WHILE
    }//KONEC MAIN

nyler ::

Malo Googlanja ne škodi :)

http://stackoverflow.com/questions/4040...


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C - shranjevanje rezultatov iz baze v array

Oddelek: Programiranje
71227 (926) Randomness
»

java pomoč

Oddelek: Programiranje
211975 (1367) kr?en
»

[Java] Ali array vsebuje primitivno vrednost?

Oddelek: Programiranje
121419 (1163) t3hn0
»

Java-random-polje

Oddelek: Programiranje
6960 (839) LeQuack
»

JAVA - Math.random, kako določit interval?

Oddelek: Programiranje
205172 (2828) Sergio

Več podobnih tem