existe um método para gerar números aleatórios sem repetição na classe Random?
Sim!
int random = (int)(Math.random() * 0+10);
O código acima gera números aleatórios do 0 ao 10.
mostra apenas o numero 10
Ops. é int random = (int)(Math.random() * 10+0); é só enverte o 0 pelo 10
esse repete os números, gostaria que não repetisse.
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.
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.
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");
}
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’.
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++;
}
}
Não disse que meu algoritmo é otimizado
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.
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.
Concordo a 200% 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.