JavaScript ile sayı aralığından rastgele sayı çekme

Jon1Snow

Hectopat
Katılım
30 Aralık 2020
Mesajlar
1.261
Çözümler
4
Daha fazla  
Cinsiyet
Erkek
1-36 arasında(1 ve 36 dahil) rastgele sayı çekme ve çekilen sayıdan bir daha çekmeyecek kodu nasıl yazabilirim? Mantığı nedir?
 
Son düzenleme:
Çekilen sayı bir daha çekilmesin istiyorum nasıl yapabilirim?
Aldığın sayıları bir listeye ata. Ondan sonra JS'de olan indexof() metodu ile kontrol yap. Eğer yapamazsan sayısal loto yapanlar var JS ile onların videolarını izlersen anlarsın. Aynı mantığı kullanıyorlar.
 
indexof() ile yapılırsa zaten baştan O(n^2) olur. Eğer performans ön plada ise önermem.

Kendi projelerimde kullandığım function'lar şu şekilde;

[CODE lang="javascript" title="// Typescript"]export function randomNoRepeatingSample(sampleSize: number, length: number): number[] {
const arr = [...Array(length)].map((x, i) => i);
shuffleArray(arr, ShuffleDegree.LIGHT);
const selectedRange = Math.randomRange(length - sampleSize);
return arr.slice(selectedRange, sampleSize + selectedRange);
}[/CODE]

[CODE lang="javascript" title="// Typescript"]export enum ShuffleDegree {
SUPER_LIGHT = 0.25,
LIGHT = 0.5,
NORMAL = 1,
HARD = 2,
SUPER_HARD = 4
}[/CODE]

[CODE lang="javascript" title="// Typescript"]export function int(num: number): number {
return ~~num;
}[/CODE]

[CODE lang="javascript" title="// Typescript"]export function shuffleArray<T>(arr: T[], degree: ShuffleDegree = ShuffleDegree.NORMAL): void {
const len = arr.length * degree;
for (let i = 0; i < len; i++) {
const n1 = int(Math.randomRange(len));
const n2 = int(Math.randomRange(len));
arr.swap(n1, n2);
}
}[/CODE]

[CODE lang="javascript" title="// Typescript"]extendArrayPrototype('swap', function (this: number[], n1: number, n2: number): void {
const temp = this[n1];
this[n1] = this[n2];
this[n2] = temp;
});[/CODE]

Type'ları kaldırırsanız Javascript. Enum yerine Object kullanılabilir.

Genel mantık X kadar sayıdan Y kadar sayı çekilecekse (Pigeon Hole prensibine göre tekrar etmemesi için X > Y olmalı)
X kadar sayıyı sıralı bir şekilde dizip sonrasında sayıları random şekilde karıştırılır. Ne kadar çok karıştırılırsa o kadar random olacaktır. Karıştırma işleminin ardından X-Y (farkı kadar) aralığında random bir index şeçilip Y kadar sayı slice edilir. Böylece Y kadar tekrar etmeyen 0-X aralığında random sayınız olur.
 
Son düzenleme:
indexof() ile yapılırsa zaten baştan O(n^2) olur. Eğer performans ön planda ise önermem.
Evet, dediğiniz doğru. Bu şekilde önermemin sebebi projenin performansa yöneldiğini düşünmemem. Konu sahibi arkadaşı, az çok tanıyorum yeni yeni projeler geliştirmeye çalışan birisi. Ondan dolayı indexOf() ile yapmasını tavsiye ettim. Yoksa dediğiniz şey çok doğru. Belirtsem iyi olurdu onu fark ettim şu anda, benim yerime belirttiğiniz için teşekkür ederim.
 
Çekilen sayı bir daha çekilmesin istiyorum nasıl yapabilirim?
<!DOCTYPE html>
<html>
<head>
<title></title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
<div id="sonuc"></div>
<br>
<input type="submit" value="Seç" id="sec">
</body>
<script>
var sayilar = []
$(function(){
$("input#sec").on("click",function(){
sayiSec()
})
})
function sayiSec(){
var sayi=Math.ceil(Math.random()*36)
if (sayilar.indexOf(sayi)=="-1") {
sayilar.push(sayi)
$("div#sonuc").html(sayi)
} else {
sayiSec()
}
}
</script>
</html>

Yazılımcı vs. değilim. Uluslararası ticaret mezunuyum. Bu konulara meraklıyım sadece.
 
Son düzenleme:

Technopat Haberler

Geri
Yukarı