GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Numeros aleatorios


#1

existe um método para gerar números aleatórios sem repetição na classe Random?


#2

Sim!

int random = (int)(Math.random() * 0+10);

O código acima gera números aleatórios do 0 ao 10.


#3

mostra apenas o numero 10


#4

Ops. é int random = (int)(Math.random() * 10+0); é só enverte o 0 pelo 10


#5

esse repete os números, gostaria que não repetisse.


#6

Número aleatório é mesmo assim. Da mesma forma que se lançares um dado 6 vezes não vais obter uma vez cada número de 1 a 6 (ok, podes obter mas é pouco provavel), também se obtiveres 10 números aleatórios de 1 a 10 não vais obter uma vez cada um.

O que provavelmente tu pretendes é simplesmente criar uma lista de números de 1 a 10 e depois embaralhar essa lista.


#7

Primeiro, amigão, é bom dizer que existem duas maneiras de gerar números aleatórios em Java.

1 - A classe Math, com o método random().
Esse método retorna um valor do tipo double, sempre entre 0 e 1.

Exemplo para gerar um número inteiro entre 1 e 10:

// em (int) você está fazendo um cast, uma vez que o método retorna um double e a 'conversão' é necessária    
int n = (int) (Math.random()*10+1);

2 - A classe Random. Essa classe pode gerar tanto dados do tipo int, quanto dados do tipo double, float, boolean, etc… Tudo depende do método que você irá chamar.

Para gerar um número inteiro entre 0 e 9:

Random r = new Random();
// pode gerar 10 números, no intervalo entre 0 e 9
int n = r.nextInt(10);

Caso queira gerar números entre 1 e 10, você deve somar 1. Por exemplo:

Random r = new Random();
int n = r.nextInt(10)+1;

Não se esqueça de importar a classe com a linha import java.util.Random;

Agora, para gerar números aleatórios não repetidos é você que deve montar uma lógica.
Crie um vetor e armazene estes números. sempre que adicionar um novo, compare-o com todas as posições do vetor.

Algo mais ou menos assim:

import java.util.Random;

public class GerarNumeros {

	public static void main(String[] args) {

		int[] v = new int[10]; // vetor de 10 posições
		Random gerador = new Random(); // nosso gerador de números
		boolean b = false; // um controlador

		for (int i = 0; i < v.length;) {
			if (i == 0) {
				v[i] = gerador.nextInt(20) + 1;
				i++;
			} else {
				v[i] = gerador.nextInt(20) + 1;
				b = false;
				for (int j = 0; j < i; j++) {
					if (v[i] == v[j]) {
						b = false;
						break;
					} else {
						b = true;
					}
				}
				if (b) {
					i++;
				}
			}
		}
		
		for (int i = 0; i < v.length; i++) {
			System.out.print(v[i] + "\t");
		}
	}
}

Saída do código:
4 8 1 3 6 7 10 5 2 9

OBS: Você também pode utilizar a API Collections para fazer isso.


#10

Para que complicar? Este não é um problema de números aleatórios mas simplesmente de alterações de ordenação. Utilizar random e depois verificar se o número já existe é extremamente ineficiente (há até pequena probabilidade de ser “infinito”)

    List<Integer> numeros = new ArrayList<>();
    for (int i=1;i<=10;i++){
        numeros.add(i);
    }
    Collections.shuffle(numeros);

    for (Integer n:numeros){
        System.out.print(n+"\t");
    }

#11

Pensei que o rapaz queria Números ALEATÓRIOS não repetidos. O que seu algoritmo faz não é número aleatório, mas sim apenas uma sequencia númerica com incremento já definido.
Agora imagine que nesses números aleatórios ele queira valores de 1 a 9999 em uma Lista de apenas 10 posições. Como você faria isso?
Iria popular 9999 posições, dar um Shuffle e mostrar apenas as 10 primeiras? Isso também é extremamente ineficiente.

Admito, como você disse, que meu algoritmo é ineficiente, mas um exercício como esse é típico na aula de Introdução a Algoritmos em qualquer faculdade de esquina logo que o professor entra no tema de Vetores.

Por isso mostrei esse algoritmo um tanto ‘clássico’.


#12

De certeza?

Vamos pegar então no 9999. Se for um caso como o deste problema, em que são necessárias 9999 posições com valores de 1 a 9999, o teu algoritmo (optimizado) demora em média 196 ms, e o meu 2 ms.
Para o caso que tu queres, de 10 posições com valores de 1 a 9999 temos que o meu continua a demorar os mesmos 2 ms e o teu sim, é mais rápido em 0.1 ms.

Se aumentarmos para 99999, o meu demora cerca de 6 ms em qualquer dos casos, o teu varia entre 0.1 ms para as 10 posições e 19594 ms (20 segundos!)

(Todos os tempos são valores médios de 8 execuções)

Estás a perceber agora qual será mais ineficiente?

Mas, se ainda assim, queres manter o teu algoritmo, sempre podes melhora-lo, retirando ifs desnecessários:

    int[] v = new int[n];
    Random gerador = new Random(); // nosso gerador de números
    boolean b; // um controlador

    for (int i = 0; i < n; ) {
        v[i] = gerador.nextInt(max) + 1;
        b = false;
        for (int j = 0; j < i; j++) {
            if (v[i] == v[j]) {
                b = true;
                break;
            }
        }
        if (!b) {
            i++;
        }
    }

#13

Não disse que meu algoritmo é otimizado :thinking:

Outra coisa que podemos levar em consideração é o uso de memória. Tem certeza de que você pretende usar essa memória de maneira desnecessária?

Suponhamos uma situação em que desejamos preencher 1000 posições com números aleatórios de 1 a 500000 não repetidos (sei que a probabilidade de se repetirem é mínima).

Seu código:

private static final long megabyte = 1024l * 1024l;

public static long bToMb(long bytes) {
	return bytes / megabyte;
}

public static void main(String[] args) {
	List<Integer> l = new ArrayList();
	long tempoInicio = System.currentTimeMillis();
	for (int i = 0; i < 500000; i++) {
		l.add(i);
	}
	
	Collections.shuffle(l);
	
	System.out.println("Começou");
	for (int i = 0; i < 1000; i++){
		System.out.print(l.get(i) + "\t");
	}
	System.out.println("\n\nTempo Total: "+(System.currentTimeMillis()-tempoInicio));

	Runtime r = Runtime.getRuntime();
	r.gc();

	long memoria = r.totalMemory() - r.freeMemory();
	System.out.println("Memória utilizada em bytes: " + memoria);
	System.out.println("Memória utilizada em megabytes: " + bToMb(memoria));

}

OBS: Me corrija se seu código tiver diferenças gritantes

Meu código:

private static final long megabyte = 1024l * 1024l;

	public static long bToMb(long bytes) {
		return bytes / megabyte;
	}

	public static void main(String[] args) {
		int[] v = new int[1000];
		Random gerador = new Random(); // nosso gerador de números
		boolean b; // um controlador
		long tempoInicio = System.currentTimeMillis();
		for (int i = 0; i < v.length;) {
			v[i] = gerador.nextInt(500000) + 1;
			b = false;
			for (int j = 0; j < i; j++) {
				if (v[i] == v[j]) {
					b = true;
					break;
				}
			}
			if (!b) {
				i++;
			}
		}
		
		for (int i = 0; i < v.length; i++) {
			System.out.println(v[i]);
		}
		System.out.println("\n\nTempo Total: " + (System.currentTimeMillis() - tempoInicio));

		Runtime r = Runtime.getRuntime();
		r.gc();

		long memoria = r.totalMemory() - r.freeMemory();
		System.out.println("Memória utilizada em bytes: " + memoria);
		System.out.println("Memória utilizada em megabytes: " + bToMb(memoria));

	}

Saída do seu código:

315500	342653	199373	437956	205643	88065	351477	450403	125466	148979	143526	15788	101354	412165	21647	122437	183690	3019	439699	150461	421145	263893	174117	419108	290829	449569	460274	59789	236186	305409	431901	432431	235417	260275	306888	418581	358169	75728	478061	153324	346663	301145	398599	274033	107193	212232	71877	447938	475141	259839	98294	499532	29747	179221	305815	135263	436230	231227	472199	255597	48295	62074	329801	439490	447703	200058	444404	240120	58131	493587	50355	375881	58506	434302	415293	51493	345944	93530	20538	453175	91243	101738	337407	157609	470662	303265	484258	467873	292683	236540	18747	153333	296241	330221	199985	255617	147705	495843	334273	27250	152167	442182	269906	245793	37243	409472	66347	475902	299167	20985	173913	146787	349956	139876	388071	101061	110802	60280	202262	103316	262468	239567	356515	338325	143836	95391	458940	448881	5299	104220	15731	342309	296780	430392	47191	112374	261370	299319	425427	46996	258058	313126	324798	1406	87813	234265	218596	49758	191952	410953	47975	82782	59915	228459	416772	284675	72351	348282	176396	279950	297729	13438	312034	129149	312372	296177	170664	132427	344447	79041	311233	10089	182580	464696	462086	200347	204659	64024	247500	90288	50249	297292	388244	74487	136028	389931	178203	453637	273449	266114	237767	493821	311428	425541	425523	272653	257	173670	400741	4728	370999	12390	55156	301949	449252	213091	16154	25570	285333	429222	41602	180052	330626	330772	486194	139333	401750	488478	117709	67001	211204	219694	417598	472422	181719	372684	478878	359041	100276	143048	326741	292583	384340	328654	499057	15397	467125	457806	122599	219688	67601	218802	53663	475059	336895	368005	54892	369035	137367	466710	5904	185291	52606	17415	105863	4721	383839	36043	308701	304008	459200	133220	492637	350520	261761	247815	66958	399279	434465	45175	323967	118382	243438	453217	3266	148881	415808	25400	142235	250612	79661	167778	258769	297085	310170	162089	168419	437081	439471	110634	101191	395856	105030	485806	370395	57893	192346	396152	2467	193856	243924	377243	388607	314190	145376	358264	60338	221251	379811	346448	75338	451405	158218	158264	17652	40673	317044	386172	151548	408850	119197	294829	93696	474410	210347	24335	72038	310225	7086	82729	459378	233372	33108	24263	162618	257535	146791	320570	219316	331027	478447	432405	112285	202264	412856	362966	287191	466931	361794	320614	463249	253872	329691	265788	146040	41409	15639	301054	439536	71026	204363	229548	377185	459706	285165	188142	4884	141454	1180	43623	492288	254134	430736	145179	357333	341546	335740	456839	20438	485158	288155	151930	182200	166733	338352	406886	51128	328864	28608	131577	57221	478086	92398	436103	176978	34416	115636	444686	325245	299902	271656	322111	193265	413800	375013	203188	274041	235087	165228	372502	279948	219100	365982	26468	431103	133787	462051	280590	68639	437734	455102	324013	204639	223480	346107	174578	249282	2389	354829	412971	368816	304131	360302	348411	134767	77760	324892	24750	128588	164831	78705	275222	436289	3072	443033	293710	156621	153248	438869	69796	345599	361269	487779	28209	194869	136909	378372	269793	140695	74533	114901	368819	108783	153300	299695	185299	129776	270920	283128	424768	304376	186720	378432	40348	78639	432534	298408	38962	285364	220688	209527	452304	450975	421656	172900	356229	52992	308499	225755	423028	387638	319426	342991	147482	308377	165199	446842	348007	469854	436207	353205	461404	382264	356396	373294	46131	64022	210814	215993	324530	44118	50123	129702	13493	453926	137003	152375	298722	293594	211142	252807	409692	271862	428837	291442	425001	109580	209065	442153	386564	441358	282498	134936	45690	246190	242373	487039	67699	101844	417525	10935	176979	329598	445762	380385	388907	287593	283316	136101	185242	103208	388555	382870	148185	399651	369765	217566	183862	88903	111146	50528	349229	54907	474424	294915	5032	185284	263136	297886	209532	388474	434685	492901	271244	408912	246757	400390	211777	400365	221858	475294	33809	46678	10992	451576	257732	67848	185646	287551	396454	113765	42196	200942	163833	262940	185583	75570	409946	495454	227904	60259	154783	483311	261610	369724	442418	120351	10728	138052	379259	281174	232088	72614	58883	248196	180409	88948	208215	207727	457885	411714	307153	395763	109547	15559	13674	52157	277982	427382	296055	230205	43144	251558	405860	450697	333202	20443	42815	139582	107919	81749	351374	457069	356795	195892	293533	480734	428406	30912	40010	447913	36114	278199	254235	393455	388272	186928	245575	60199	188595	16719	117083	367261	99643	188445	311478	128711	178126	329095	491567	477929	431108	210201	172811	178354	39182	178472	113079	221106	440349	273904	223294	375479	415644	98307	122754	484285	358945	471128	350519	162348	3833	151762	278964	413830	328405	317140	291220	83663	94334	67904	125729	64495	146515	342055	213993	63761	336332	149244	192274	254674	351178	418005	344132	131610	207614	469831	162777	318815	7105	369365	302571	217466	279420	416088	424364	424557	370308	442494	472836	408205	293136	35449	392085	249613	488481	485150	170567	481614	401829	70983	198266	169587	151282	439417	57785	311397	341385	306465	309854	28067	430844	141427	260095	207094	118417	204057	321151	414013	172732	161386	302998	128220	8646	112312	271636	64353	219730	168814	64189	63210	204973	323397	454494	183910	74631	499733	344289	246329	392423	430147	62396	300301	366084	209391	295403	381627	462344	391269	25849	225910	485033	228322	327084	253641	453836	370327	112940	106497	113643	149906	38582	238812	280846	160564	325856	466017	49130	120435	382934	14655	105475	231066	51894	353873	328414	290764	65845	499919	407017	397744	28040	271074	494770	415778	153777	260254	111743	201678	151336	33300	85997	180605	80090	213173	49574	55165	382339	100949	337574	119995	265263	341760	251596	228626	94468	489447	294265	362006	393977	246468	390594	467185	283912	65152	200530	235478	253178	78059	155390	124182	64063	25266	496856	213740	432120	139173	351877	51986	145185	323081	141470	176274	277466	349152	180293	480840	56024	40543	334688	474322	98320	467754	269171	358593	107167	260483	206552	338812	7291	365000	474237	68624	395459	25941	137875	410600	130785	401147	429394	243123	69345	295228	3121	212333	361197	1612	424776	247691	434975	387473	22207	438194	299621	472069	308385	223762	406164	253495	370649	309917	232375	140654	402715	493158	402004	338912	191789	102627	132219	415714	484637	203004	73179	481220	498739	463447	311655	226277	331756	157904	432300	41037	396382	128726	440592	227170	232967	352421	197093	311606	194141	184635	248833	377554	304999	23463	383592	674	422976	402254	226670	261082	143146	265672	362459	129440	364944	243411	114884	483544	208332	75563	329560	115534	445647	191612	169441	396887	374253	346096	462564	263235	138794	258051	363419	493436	478411	394429	405934	254267	137418	443214	489897	118885	396793	486936	79857	348045	479941	

Tempo Total: 72
Memória utilizada em bytes: 10458296
Memória utilizada em megabytes: 9

Saída do meu código:

233156	315638	368364	109330	397209	407539	499051	434642	124973	226597	272948	414297	424479	191311	360176	430188	421942	297138	400429	290178	5505	240769	488107	237938	371513	191008	100468	58493	481698	160254	132681	452789	352720	193228	203799	209353	426823	68569	487528	221710	420987	268587	34709	239339	117813	268188	426713	93537	129335	301359	159169	36853	312374	347117	186336	386940	272902	42849	320991	379138	165941	147532	426738	147798	371149	114181	318117	368469	234045	395153	260309	425746	309841	298459	303291	10655	485853	393104	97539	493531	364921	312377	102011	118232	121990	289046	318438	154535	51695	103924	359089	279715	454826	459306	65629	57207	495422	189974	481083	142188	296063	205263	252758	443922	478260	404134	474249	291114	426714	237406	78097	487055	464321	203013	43773	455199	263252	358926	315587	279081	257590	409165	434316	311061	194568	449582	380175	17546	217351	383250	97116	443808	317330	392039	70126	324291	55721	296386	339267	432224	320913	350972	478440	125199	429204	409318	15501	456669	347813	209451	492857	334453	327137	483041	414646	21835	400241	134570	19916	224709	240716	73581	105964	443206	479641	37836	337506	29175	19762	162755	18894	366164	88581	141212	414060	403921	306900	64465	227119	41799	241564	62047	395340	30367	433778	104963	208786	491866	124777	338356	169720	237531	445041	371356	442799	160817	234009	361588	248631	269828	409877	136187	37325	286651	272986	215507	93857	214184	444870	408281	189349	368561	177758	152223	34146	225948	115503	158439	73349	223350	110709	203710	108087	133536	104570	110930	175658	220662	425206	388466	186158	121469	173557	234689	493636	166121	261366	270390	431402	60456	469391	172114	105909	370254	377486	284479	146557	3390	78522	403906	371026	92114	146361	391645	143308	303944	291051	428388	235008	298569	441747	436505	442702	454870	91989	95558	244247	63633	64762	360503	274157	396933	155441	92177	6722	145556	82865	460627	476898	454875	311257	351655	292669	107683	155736	309637	103900	188263	64424	214789	222549	196733	214900	309182	415226	115619	386971	229696	132779	432616	251533	197963	443404	183060	135282	349161	135057	91092	424618	264847	352629	13222	70575	42091	448618	462333	460150	463178	27019	197201	118389	23209	492014	48071	95966	370358	129109	272761	456521	423331	329251	39457	5265	315141	72011	122183	351060	218095	75684	289445	440734	371206	379258	28499	383999	327969	456638	143667	420728	368704	417501	107867	24566	269509	129325	277723	295157	194355	72068	129578	193605	225217	183971	12754	254602	290555	269264	119508	9629	62710	186017	221433	93040	111694	94004	306614	71343	129374	448156	385242	154530	89850	286645	114584	218959	164876	302873	128940	100636	310986	406795	303756	113426	64913	207120	3404	362077	419936	485405	439534	68816	187219	137452	266532	402149	297529	493000	24675	315010	239733	473000	344230	98839	204270	261625	384700	119716	164115	480435	413423	61048	296783	460749	102386	383956	489220	46669	328198	81069	205128	154199	419273	405776	369081	390503	478523	400448	100989	99002	412110	233372	371494	469962	198140	188111	343819	139195	85305	260173	32577	375096	144428	91990	176432	319184	197742	29712	10238	404114	408255	17094	198722	175289	451	281884	280152	165618	46854	223212	17102	53836	437408	20482	175867	66811	471956	469424	368591	499913	405874	327119	235398	311034	229789	131059	273398	8314	96006	123017	199751	100709	220535	76751	249762	121234	121228	230032	355106	213117	197979	491708	302023	262960	123124	404960	151978	178765	156324	350182	130347	149019	135028	227596	28934	207722	91438	215257	288996	443940	199423	276642	255437	317810	405560	413688	129339	77321	336398	126379	56201	292303	73762	276543	91403	173646	163579	19145	230104	53875	160719	473318	29153	222371	471137	50488	322085	183516	215972	215134	59773	278403	227677	156751	51	95759	194982	322579	194000	141232	233487	281662	99666	164701	361280	16106	321724	338106	269401	212367	396167	12162	311194	233218	95223	227703	60830	64008	69544	462787	161058	384277	385383	467881	458404	470533	290557	369197	474950	264789	361478	216381	62482	67711	3296	52443	231256	365329	259295	92808	50802	103273	373917	377038	180040	443823	453199	49546	302959	282639	149970	172628	246893	215505	182212	92908	203832	352279	368144	220707	381084	136850	464417	334307	217755	310689	79127	473180	90862	469832	277399	26924	229834	282729	61885	228426	267070	499233	49837	429904	394873	298561	326856	89474	174984	228487	335865	233791	350717	478649	284878	425155	321643	262110	401924	405494	480366	9049	438204	222869	134759	460642	219562	392955	270501	51427	450604	333867	381888	95692	50423	182845	189854	194227	363468	273699	45016	430604	27018	240886	228663	105888	377757	363074	236120	422221	69141	58666	99055	314234	461841	257690	197831	9429	107098	12039	28295	48459	7180	335909	230608	125956	335055	319429	100644	219416	122372	170472	413505	62066	321531	157893	394570	450687	319393	241107	347430	340723	486518	261332	246082	466905	284989	207486	471569	104308	498188	408870	464756	447286	425667	117483	301685	69628	130970	341149	346829	131205	64307	65896	103366	194158	152175	72705	278170	9355	199740	246891	231290	124707	272524	45158	262699	266985	278785	402806	325930	386162	93124	441291	316048	108088	377493	488978	341713	39530	440956	41815	297374	134893	19070	476693	87979	464564	15563	457756	276395	89815	217172	461950	166615	109523	479579	447190	181357	146398	77923	451701	158357	270949	23781	224906	391967	248452	209444	438830	326568	307681	395225	428905	58908	85957	453864	411524	142517	182168	273267	85100	78017	429080	384237	176319	417570	357781	11782	203063	250127	308333	492741	346480	380983	50751	405621	486968	149093	86798	445494	303922	309952	101780	481140	153350	257258	342016	431893	180329	69768	183405	471915	365572	166048	425441	310057	10243	411102	250719	454931	57949	21266	305673	64238	22107	287827	248117	24854	346087	90599	487786	399694	487155	349018	234136	278162	75138	32043	310418	199241	428119	225927	443625	234774	213624	354189	439782	79182	470302	100848	28195	249956	264092	7419	382182	454751	140778	76526	112667	386253	308653	407495	482350	141969	13060	405532	66498	488887	321009	257221	113136	396585	184099	6422	472703	433946	65180	50090	342428	92607	279908	455451	241174	418909	392297	78	72985	497918	413580	223813	298014	387293	299370	67691	395105	245050	127882	340036	377191	43368	327514	496333	333783	331456	295227	482018	172409	94116	69020	14646	87008	29768	35140	218252	297892	215542	341199	165910	117006	465282	56016	235751	333612	354282	249140	152983	284644	408009	337543	308531	182342	40474	383376	439006	471066	27075	292439	319336	95736	245285	223399	112040	165206	298942	127311	493721	469692	308441	340738	487535	353459	436691	369406	359381	412476	51595	313770	235973	281598	239813	183832	204003	440215	110554	454666	277366	430387	329344	207249	142339	177178	80626	397328	298951	

Tempo Total: 24
Memória utilizada em bytes: 297144
Memória utilizada em megabytes: 0

Como você mediu o tempo de execução? Meus resultados aqui deram extremamente diferente dos seus.


#14

Há mais de uma abordagem para esse problema e isso é fato. Até onde entendo:

  • se é necessário gerar um conjunto N de números aleatórios num espaço de números próximo ou igual a N (exemplo: 100 números entre 0 e 100), a abordagem do pmlm provavelmente é melhor (a memória para os N elementos precisaria ser usada de qualquer jeito, então não faz diferença);

  • se é necessário gerar um conjunto N que é pequeno em comparação com o espaço total de números (10 números entre 0 a 50000), a abordagem do matheus.cirillo pode ser melhor na maioria dos casos (o ganho de memória faz diferença, e a chance de colisão no random é pequena, o que ajuda na comparação se o elemento já existe).

Só pra contrapor um pouco:

                Set<Integer> set = new HashSet<>();

		Random r = new Random();

		int num;

		long tempoInicio = System.currentTimeMillis();

		while(set.size() < 1000){
			num = r.nextInt(50000);
			set.add(num);
		}

		Iterator<Integer> iter = set.iterator();
		while (iter.hasNext()) {
		    System.out.print(iter.next().intValue() + "\t");
		}

		System.out.println("\n\nTempo Total TESTE 2: "+(System.currentTimeMillis()-tempoInicio));

		Runtime runt = Runtime.getRuntime();
		runt.gc();

		long memoria = runt.totalMemory() - runt.freeMemory();
		System.out.println("Memória utilizada em bytes: " + memoria);

Resultado:

Tempo Total TESTE 2: 5
Memória utilizada em bytes: 646872

Obs: iterar as listas e sets e fazer System.out.print(…) afeta o tempo de execução, então é preciso levar isso em consideração na medida de tempo. Se eu retiro a exibição dos números gerados do meu código (com HashSet), obtenho:

Tempo Total TESTE 2: 1
Memória utilizada em bytes: 645568

É o velho caso de equilibrar as necessidades com a complexidade do algoritmo e recursos envolvidos (tempo e memória).

Abraços.


#15

Concordo a 200% :slight_smile: Para o problema inicial de 10 em 10 defendo o meu. Para outros casos, como demonstrei acima, depende de que quantidade precisamos do universo de números.

Todos os meus tempos foram medidos sem prints.