Şimdi Ara

C++ BİRBİRİNDEN FARKLI RASTGELE SAYI ?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
12
Cevap
0
Favori
367
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • merhaba c++ da mesela 20 ile 50 arasında rastgele birbirinden farklı 10 adet sayı üretmek istiyorum ama ne yaptıysam bir türlü olmadı nasıl birşey yapabilirim örneğin 20 32 43 24 26 29 44 43 33 38 gibi olucak




  • boşver kavga çıkıyor C++ BİRBİRİNDEN FARKLI RASTGELE SAYI ? 

  • quote:

    ne yaptıysam bir türlü olmadı
    dediğin kısımda yaptığın kodları bir gönder bakalım önce

    < Bu ileti mini sürüm kullanılarak atıldı >
  • çok zor soru mu sordum ?

    < Bu ileti mini sürüm kullanılarak atıldı >
  • hocam bakamadım kusura bakmayın şöyle birşey yaptım burda 0 la 10 arası rastgele sayılar yapabildim boyutu kaçsa onla o arasında olan sayılar ama bunu bir türlü aralık haline getiremedim 20 ile 50 arasında 10 adet rastgele sayı gibisinden

    #include <iostream>

    using namespace std;

    #include <locale.h>

    #include <ctime>

    #include <iostream> 

    int main()

    {

    srand(time(0));

    const int BOYUT = 10;

    int rastgeleSayi;


    int dizi[BOYUT] = { 0 };


    for (int i = 0; i <= BOYUT - 1; i++)

    {


    while (true)

    {


    rastgeleSayi = rand() % 10;


    if (dizi[rastgeleSayi] == 0)


    {

    dizi[rastgeleSayi] = i;

    break;


    }



    }

    }

    for (int i = 0; i < BOYUT; i++)

    {

    cout << dizi[i] << endl;

    }

    return 0;

    }

  • hocam birde şey düşündüm rastgele sayı üretmek yerine bir dizi oluşturup for ile dizinin elemanlarını tek tek yazdırsam sonra random_shuffle komutu ile dizinin elemanlarını karıştırıp ilk 10 elemanını felan alsam olabilir mi bunun gibi mi birşey yapmalıyım yada random komutu ile farklı bir yolu varmıdır ?

  • Kod eksik ve hatalı. int dizi[BOYUT] = { 0 }; dediğinde ilk elemana 0 koyar fakat ilk eleman neden 0? Sondaki cout << dizi, cout << dizi i olmalı fakat o çok basit, hatadan saymayalım, ona typo / yazım hatası diyelim.

    if (dizi[rastgeleSayi] == 0) kısmında int türünde dizinin endeksine rasgeleSayi koymak ta oldukça radikal bir hata. Ayrıca 20 ve 50 arası kontrol için kullanılacak 20 ve 50 degerlerini göremedim.

    bu problemin en direkt çözüm yolu :

    20-50 arası ras adında rasgele sayı üret.ras dizinin içinde yoksa diziye ekle, ras dizinin içinde varsa farklı ras ile tekrar (öz) yinele, dizi büyüklüğü boyuta ulaşana kadar bunu (öz) yinele. özyinele => recursion.


    ras dizinin içinde yoksa kısmını kolaylıkla yapabilmek için c++11 kullanmalısın. ödevde c++11 değil klasik c++98 kullanmak gibi şart var mı?

    random_shuffle kullanarak bahsettiğin çözüm yöntemi bence geçersiz, ona direkt sıfır verebilir hodja :)



    < Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 6 Nisan 2021; 17:43:38 >
    < Bu ileti mini sürüm kullanılarak atıldı >




  • c++11 kullanmalısın gibi bir şart yok tamamdır çok teşekkür ederim dediğinizi yapmaya çalışıcam

  • themathado53 T kullanıcısına yanıt
    tüyo vereyim mi :)

    özyineleme tekniği uygulanmış c++11 çözümü
    C++ BİRBİRİNDEN FARKLI RASTGELE SAYI ?


    quote:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <time.h>
    using namespace std;
    vector<int> rasgele (int boyut, int alt, int ust, int rasg, vector<int> liste ) {
    if (boyut < 1)
    return liste;
    else {
    if (any_of(liste.begin(), liste.end(),[rasg](int elt) {return rasg == elt;}))
    return rasgele(boyut, alt, ust, alt + rand() % (ust-alt+1) , liste);
    else {
    liste.push_back(rasg);
    return rasgele(boyut-1, alt, ust, alt + rand() % (ust-alt+1) , liste); } } }
    /* Öz yinelemeli / rekürsif işlev */

    int main (int argc, char *argv[]) {
    srand (time(NULL));
    int boyut = atoi(argv[1]); /* örn 10 */
    int alt = atoi(argv[2]); /* örn 20 */
    int ust = atoi(argv[3]); /* örn 50 */
    vector<int> gecici{};
    vector<int> listem = rasgele(boyut, alt, ust, alt + rand() % (ust-alt+1), gecici);
    sort( listem.begin(), listem.end() );
    cout << "Tekrar etmeyen " << boyut << " rasgele sayı: " ;
    for_each(listem.begin(),listem.end(), [](int n){cout << n << ' ';}); }


    Not: debug etme amaçlı koyduğum sort orada kalmış, onu kaldırırsan sayıların sırası da rasgele olur.



    < Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 6 Nisan 2021; 21:15:28 >
    < Bu ileti mini sürüm kullanılarak atıldı >




  • Kod

    Yığını:
    #include <iostream> #include <stdlib.h> #include <ctime> using namespace std; int main(){ srand(time(NULL)); int num1=20,num2=50; int range=num2-num1; int arr[10];   for(int i=0;i<10;i++){ arr[i] = num1 + rand() % range; for(int j=0;j<10;j++){ if(i==j) continue; if(arr[i]==arr[j]){ i--; break; } } } }

    Iterative şekilde yaptım. O(N^2)

  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.