C/C++ C++ ile seçili aralıkta rastgele sayılar üretme

serhatt123

Hectopat
Katılım
1 Şubat 2020
Mesajlar
110
Problem tam olarak şu şekilde;
Klavyeden girilecek sayida öğrencinin 1 vize 2 ödev ve 2 kısa sinav notunu rastgele şekilde atayan algoritmayi yaziniz. Her sınavin notlari kendi içinde %20'si 80-100 arasi, %50'si 50-80 arasinda %30'u ise 0-50 arasında olsun. Bu yüzdelik dilimler olasılık değil, örneğin 10 öğrenci varsa 2'si 80-100, 5'i 50-80 arasında olacak gibi.
Evet bu kadardi, kendim yapmaya ve yapay zekaya yaptirmaya çalıştım ama yüzdelik dilim kısmını tutturmayi basaramiyorum. Algoritmada bunlar olasilik olarak algılanıyor ve hocanın istediği şekilde olmuyor, nasıl yapmam gerekli?
 
Yapacağın işi önden bölüp, böldüklerini farklı rastgeleliklerde işleyeceksin.

C:
    int toplamogrenci = 10;

    int yuksekkesim = (toplamogrenci / 100) * 20;
    int ortakesim = (toplamogrenci / 100) * 60;
    int dusukkesim = (toplamogrenci / 100) * 20;

Kaç öğrenciye hangi aralıkta not vereceğini rastgelelik olmadan hesaplamış oldun. Şimdi, hesapladığın öğrencilere rastgele aralıkta puan vereceksin.
 
Yapacağın işi önden bölüp, böldüklerini farklı rastgeleliklerde işleyeceksin.

C:
    int toplamogrenci = 10;

    int yuksekkesim = (toplamogrenci / 100) * 20;
    int ortakesim = (toplamogrenci / 100) * 60;
    int dusukkesim = (toplamogrenci / 100) * 20;

Kaç öğrenciye hangi aralıkta not vereceğini rastgelelik olmadan hesaplamış oldun. Şimdi, hesapladığın öğrencilere rastgele aralıkta puan vereceksin.

Algoritma mantığı düzgün ama bütün o int yuksekkesim ve diğer int tanımlamalar 0 olur, buna dikkat edilirse (sınıf mevcudunun mesela 1 olduğu vb. exceptional durumlara girmiyorum) sorun kalmaz.
 
Yapacağın işi önden bölüp, böldüklerini farklı rastgeleliklerde işleyeceksin.

C:
 int toplamogrenci = 10;

 int yuksekkesim = (toplamogrenci / 100) * 20;
 int ortakesim = (toplamogrenci / 100) * 60;
 int dusukkesim = (toplamogrenci / 100) * 20;

Kaç öğrenciye hangi aralıkta not vereceğini rastgelelik olmadan hesaplamış oldun. Şimdi, hesapladığın öğrencilere rastgele aralıkta puan vereceksin.

Dediğin şekilde yaptım güzel de gidiyordum ama şöyle bir sikintiyla karşılaştım. 5 farklı fonksiyon var ama rastgele ürettiğim notlar hepsinde aynı oluyor. Srand kullanmama rağmen böyle sebebini anlamadım.
 
Döngüyü kuramamışsındır. Kodunu paylaş, bakalım.

O sorun düzeldi şimdi de hep ayni sayıyı üreten bir rand() fonksiyonu yüzünden sorun çekiyorum.

Kod:
int a = 0;
for (; a < vize_yuksek_alanlar; a++) {
 //cout << ogrenci.v_yuksek_notlar.at(a) << " aaaaaaaaaaaa";
 int rastgele_vize = rand() % 1 + ogrenci.v_yuksek_notlar.size() - 1;
 cout << rastgele_vize;
 if (ogrenci.v_yuksek_notlar.at(rastgele_vize) >= 90) {
 cout << ogrenci.kombinasyon[a] << " Vize:" << ogrenci.v_yuksek_notlar.at(rastgele_vize) <<" AA"<<endl;
 vize_harf_notuAA++;

 }

 else if (ogrenci.v_yuksek_notlar.at(rastgele_vize) >= 85 && ogrenci.v_yuksek_notlar.at(rastgele_vize) < 90) {
 cout << ogrenci.kombinasyon[a] << " " << ogrenci.v_yuksek_notlar.at(a) << " BA" << endl;
 vize_harf_notuBA++;
 }
 else {

 }

}

Rastgele_vize değişkenine döngü her başa sardığında farklı sayi gelsin istiyorum.
Bu döngü bir fonksiyonun içinde ve fonksiyonun en başında srand(time(NULL)) var. Başka döngülerde sıkıntı yokken sadece burada rastgele sayı oluşmuyor.

Güncelleme: çözdüm bu sorunu. kendi kendine çözüldü aslinda nasil oldu bilmiyorum
 
Son düzenleme:
O sorun düzeldi şimdi de hep ayni sayıyı üreten bir rand() fonksiyonu yüzünden sorun çekiyorum.

Kod:
int a = 0;
for (; a < vize_yuksek_alanlar; a++) {
 //cout << ogrenci.v_yuksek_notlar.at(a) << " aaaaaaaaaaaa";
 int rastgele_vize = rand() % 1 + ogrenci.v_yuksek_notlar.size() - 1;
 cout << rastgele_vize;
 if (ogrenci.v_yuksek_notlar.at(rastgele_vize) >= 90) {
 cout << ogrenci.kombinasyon[a] << " Vize:" << ogrenci.v_yuksek_notlar.at(rastgele_vize) <<" AA"<<endl;
 vize_harf_notuAA++;

 }

 else if (ogrenci.v_yuksek_notlar.at(rastgele_vize) >= 85 && ogrenci.v_yuksek_notlar.at(rastgele_vize) < 90) {
 cout << ogrenci.kombinasyon[a] << " " << ogrenci.v_yuksek_notlar.at(a) << " BA" << endl;
 vize_harf_notuBA++;
 }
 else {

 }

}

Rastgele_vize değişkenine döngü her başa sardığında farklı sayi gelsin istiyorum.
Bu döngü bir fonksiyonun içinde ve fonksiyonun en başında srand(time(NULL)) var. Başka döngülerde sıkıntı yokken sadece burada rastgele sayı oluşmuyor.

Güncelleme: çözdüm bu sorunu. kendi kendine çözüldü aslinda nasil oldu bilmiyorum
Srand fonksiyonu bir kere çağrılmalı aksi halde hep aynı sayıyı döndürür.
 
Srand fonksiyonu bir kere çağrılmalı aksi halde hep aynı sayıyı döndürür.

Normalde evet öyle ama ikinci kez çağırınca tüm hatalar düzeldi anlam veremedim.

Döngüyü kuramamışsındır. Kodunu paylaş, bakalım.

Hocam şuna bir bakar mısın?

For (i = 0; i <= ogrenci_sayisi; i++) {
Ogrenci. Ogrenci_ortalamalar. Push_back({ogrenci. Ortalamalar_vize. At(i)+ogrenci. Ortalamalar_kisa1.at(i)+ ogrenci. Ortalamalar_kisa2.at(i)+ ogrenci. Ortalamalar_odev1.at(i)+ogrenci. Ortalamalar_odev2.at(i)});
Cout << ogrenci. Ogrenci_ortalamalar. At(i)<<"amamam \n";
}

Ogrenci structinin içindeki vize, odev1, odev2.. Gibi Vector'lerin verilerini sırayla çağırıp, toplayıp push_back ile ogrenci_ortalamaları adlı Vector'e göndermek istiyorum. 10 veriden ilk 5'ini gönderiyor 6.da hata veriyor. 50 giriyorum 25 gönderiyor 26'da hata veriyor sebebini anlayamadım. Hata kodu ise şu şekilde: abort() has been called.
 
Son düzenleme:

Yeni konular

Geri
Yukarı