Şimdi Ara

C dilinde birbirinden farklı random sayılar atama (3. sayfa)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
62
Cevap
2
Favori
2.091
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
1 oy
Öne Çıkar
Sayfa: önceki 1234
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • Stack S kullanıcısına yanıt

    Hala bu konuda tartışma dönüyor. Sonunda çözümünü yazmışsın, bu çözüm ne zaman yavaş çalışıyor sana açıklayayım C dilinde birbirinden farklı random sayılar atama 


    Soruda verilen sayılara N=50, K=20 diyelim. List uzerinde pop işleminin average time complexitysi O(N) dir. Dediğin çözüm O(N*K) olacak. N sayısını artırınca bu çözüm yavaş çalışır. Buna karşılık N=1e6 iken basit bir hashmap kullanırsan milyon kat daha hızlı çalışan bir sonuç elde edebilirsin çünkü N sayısının bir etkisi olmaz. Bu yüzden sana soruya göre çözüm yazılır dedim.

  • Ufak bir meselede beni biri şikayet ettiğinde dakikasında ceza veriyorlar. şimdi ise saatler geçti halen çıt yok! Yazıklar olsun böyle foruma!


    Mesele sorunun genel ve doğru çözümü. Hızlı ama tartışmalı çözümü değil! şu hashmap örneğini gönder de bir bakalım.

  • quote:

    Orijinalden alıntı: hynx

    Hala bu konuda tartışma dönüyor. Sonunda çözümünü yazmışsın, bu çözüm ne zaman yavaş çalışıyor sana açıklayayım  


    Soruda verilen sayılara N=50, K=20 diyelim. List uzerinde pop işleminin average time complexitysi O(N) dir. Dediğin çözüm O(N*K) olacak. N sayısını artırınca bu çözüm yavaş çalışır. Buna karşılık N=1e6 iken basit bir hashmap kullanırsan milyon kat daha hızlı çalışan bir sonuç elde edebilirsin çünkü N sayısının bir etkisi olmaz. Bu yüzden sana soruya göre çözüm yazılır dedim.

    hashmap, O() notasyonunda rahatlatıcı gözükse da hashmap hesaplaması, instruction cycle olarak biraz maliyetli bir iş. lose lose, sdbm gibi hash fonksiyonların implementation'larında hep rahatsız edici bir while() loop vardır :)





  • quote:

    Orijinalden alıntı: Stack

    Konu ile alakasız olduğun açık. Kardeşim bu sorunun çözümü bu şekilde değil!!! Geyiği bırak işine bak!

    Belli bir noktadan sonra iş illaki karışacaktır. Rastgele sayılar sonsuza dek aynısı da gelebilir. Kaldı ki bir tane değerden bahsetmiyoruz, 20 tane farklı sayı belli bir aralıkta üretilecek.

    Bu türden çözümler genel olmalı ve tesadüfe bağlı olmamalıdır. Farzedelim ki 20 değil 20 milyon sayı olacak! Yani çakışmalar olmaması ve işlemin bir an önce bitmesi için çok dua etmek gerekiyor.

    Daha mantıklı ve pratik bir yolu var bunun. Biraz saksıyı çalıştırmak gerekli sadece.

    Birader o kadar boş ve insanlara yukardan bakan yorumlar yapmışsın ki, gülsem mi sinirlensem mi bilemedim. Bu kadar ego iyi değil, özgüven sorunların olduğunu çok belli ediyor dışarıya. Bi psikoloğa görünmeni öneririm. Selam ve dua ile <3





  • Konunun tamamını okumadım ancak şöyle basit bir algoritma yazılabilir:


    0-X aralığındaki sayılardan, rastgele Y uzunlukta bir dizi oluşturmak ve birbirinin aynısı olan iki eleman içermesini istemiyoruz diyelim.


    X+1 uzunluğunda bir dizi oluşturup (z diyelim ismine), her olası elemanı bu diziye atarız sırasıyla


    z=[]

    for i in range(X+1):

    z.append(i)

    sonra 0-X arasında rastgele sayı üretmek yerine, 0-len(z) arasında rastgele sayı üretiriz ve Z listesinde bu rastgele sayıya denk gelen sayıyı alıp asıl listemize ekleriz.


    y_list = []

    for i in range(Y):

    a = random.randrange(len(z)) // Z listesindeki rastgele bir sayının indisini seçiyoruz

    y_list.append(z[a]) // seçtiğimiz elemanı asıl listeye ekliyoruz

    z.pop(a) //eklediğimiz elemanı Z listesinden çıkarıyoruz

  • Okuduğunu anlayamayan, okumayan veya okuyup da okumadı ayağına yatan kişilik!

    İşte yıllardır senin gibilere laf anlatmaya çalışıyoruz! Yaşım da çıkacak ortaya!

    Orta yere atlamadan önce keşke sunulan çözüme bir baksaydın. Zaten aynı şeyi yapıyor C dilinde birbirinden farklı random sayılar atama 




    < Bu mesaj bu kişi tarafından değiştirildi Stack -- 2 Nisan 2021; 19:0:9 >
  • Stack S kullanıcısına yanıt

    Kod

    Yığını:
    #include <cstdio> #include <cstdlib> #include <unordered_map> #include <vector> int fe(){     int ayni= 0;     std::vector<int> a(20);     std::unordered_map<int, int> b;     for(int i=0;i<a.size();i++){         a[i]=rand()%1000000;         while(b[a[i]]){             a[i]=rand()%1000000;             ayni++;         }         b[a[i]]=1;     }     return ayni; } int main(int argc, char **argv){     int ct = 0;     srand(time(NULL));     for(int i=0;i<1000000;i++)         ct += fe();     printf("%d\n",ct);     return 0; }

    Önceki çözümü düz array olarak değil hashmap olacak şekilde değiştirdim sadece, bir de bunu C'ye çevirmesi zor olur. Milyon kat değil bin kat falan hızlı oldu belki hash kullandığım içindir. Python çözümü N=1e9da çalışmıyor galiba memory yetmediği için.


    Bu çözümde de N ile K birbirine çok yakın olursa çakışma sayısı fazla olacak, o zaman python daha iyi olur.





  • Kod

    Yığını:
    const nums = new Set(); while(nums.size !== 8) { nums.add(Math.floor(Math.random() * 100) + 1); } console.log([...nums]);

    Js in gözünü sevem

  • quote:

    Orijinalden alıntı: hynx

    Kod

    Yığını:
    #include <cstdio> #include <cstdlib> #include <unordered_map> #include <vector> int fe(){     int ayni= 0;     std::vector<int> a(20);     std::unordered_map<int, int> b;     for(int i=0;i<a.size();i++){         a[i]=rand()%1000000;         while(b[a[i]]){             a[i]=rand()%1000000;             ayni++;         }         b[a[i]]=1;     }     return ayni; } int main(int argc, char **argv){     int ct = 0;     srand(time(NULL));     for(int i=0;i<1000000;i++)         ct += fe();     printf("%d\n",ct);     return 0; }

    Önceki çözümü düz array olarak değil hashmap olacak şekilde değiştirdim sadece, bir de bunu C'ye çevirmesi zor olur. Milyon kat değil bin kat falan hızlı oldu belki hash kullandığım içindir. Python çözümü N=1e9da çalışmıyor galiba memory yetmediği için.


    Bu çözümde de N ile K birbirine çok yakın olursa çakışma sayısı fazla olacak, o zaman python daha iyi olur.

    "a" vectorünün boyutu arttırdığında maalesef işler karışıyor. Ki zaten gerçekte böyle durumlardan bahsediyoruz. Yani 20 farklı sayı için değil çok daha fazlası için!

    Örneğin yüzbin (100.000) farklı değer için bahsettiğimiz ilk yöntem bende 1.2 saniyede tamamlanırken, bu hash şeklinde tamamlanamadı. 10 bin bile tamamlanamadı!





  • quote:

    Orijinalden alıntı: cenkakay08

    Kod

    Yığını:
    const nums = new Set(); while(nums.size !== 8) { nums.add(Math.floor(Math.random() * 100) + 1); } console.log([...nums]);

    Js in gözünü sevem

    Zahmet önceki edip yazılanları bi okumayı deneseydin keşke... Bu yöntem de "brute force" dur.

    Ulan bi bitmediniz gitti!

  • cenkakay08 C kullanıcısına yanıt
    Çözüm geçersiz cunku JS'da birbirini tekrar etmeyen (unique) veri tutan "Set" yapısını kullanıyor.

    < Bu ileti mini sürüm kullanılarak atıldı >
  • cenkakay08 C kullanıcısına yanıt
    linkteki çözüm gereksiz cunku soruda 50 eleman içinden 20 tekrarsız eleman seç deniliyor. linkteki çözüm ise onbinlerce eleman içinden dahi hızlı eleman seçen bir "akıllı" algoritma şovu yapıyor. soru temel bir programcılık sorusu, clever algorithm sorusu değil.



    < Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 2 Nisan 2021; 23:33:16 >
    < Bu ileti mini sürüm kullanılarak atıldı >
  • Stack S kullanıcısına yanıt

    Benim kodda hızlı çalıştığını göstermek için mainde bir milyon kere çalıştırmıştım, asıl kod fe fonksiyonunda.

    Maindeki for loopu kaldırırsan yine çoğu değer için pythondan hızlı çalışıyor ama K N'nin yarısından büyük olmaya başlarsa fazla yavaşlıyor.


    Stack overflowdaki gibi orada Kya M, Nye N demişler, daha iyi çözümler de var.

  • hynx kullanıcısına yanıt

    Şöyle bir şey yapsam peki O(N) complexity'sinden kurtulabilir miyim?

    Kod

    Yığını:
    import random sayılar = [*range(50)] cevap = [] for i in range(20):  index = random.randint(0, len(sayılar) - 1) cevap.append(sayılar[index]) sayılar[index], sayılar[len(sayılar) - 1] = sayılar[len(sayılar) - 1], sayılar[index] sayılar.pop()

    indexlerin sayılarla bir bağlantısı olmadığı için sayıları istediğimiz gibi karıştırabiliriz. Gerçi burada swap işleminin time complexity'si ne bilmiyorum.


    Bu arada soru çok basit bir soru, bence ilk söylenen yöntemler de gayet çalışırdı niye bu kadar tartışıldı anlamadım.

  • Önceki O(NK) idi bu O(N+K) oluyor " sayılar = range(50)" den dolayı. Şimdi yine N, K dan çok büyük olursa yavaş çalışır yani. Benimki de N ile K yakın olunca çalışmıyor.

    Bu arada bence de hiçbir çözümde sorun yok ama sizinki yanlış benimki doğru denince bizimki de farklı inputlarla çalışıyor diye göstermek istedim. Boşa uzattık ama haklısın C dilinde birbirinden farklı random sayılar atama 

  • Basit soruyu nasıl baltalamış ergene bak ya . İyi güldüm kaale alıp cevap vermişsiniz bide.

    < Bu ileti Android uygulamasından atıldı >
  • Birinci sınıf BM öğrencisiyim ve konuyu şöyle okudum:


    C dilinde birbirinden farklı random sayılar atama


    ----


    Hocamız yüksek performanslı algoritma geliştirmenin herkesi harcı olmadığını ve çok nadir bulunduğunu söyledi. Bulanlar da isim alıp markalaşıyormuş. Bizim yapacağımız sıfırdan yüksek performanslı algoritma geliştirmek yerine best practices dedikleri yöntemleri araştırıp mantığını anlayıp uygulamak. Bu problem özelinde şöyle ilerlememiz gerekmez miydi?


    [1]: Problemi anla.

    [2]: Best practices araştırması yap.

    [3]: Probleme uygulama.

    [4]: Test et.


    Hocamız yanılıyor bu noktada?


    Yine derste sürekli algoritma analizi yapıyoruz. Aynı bu tür sorular soruluyor ve ilk biz aklımıza gelen yöntemi söylüyoruz. Hoca hiç eleştiri yapmadan onu yazıyor. Sonra sürekli onun üzerinden iyileştirme yapmaya çalışıyoruz. Stack hocanın sanırım vurgulamak istediği buydu. Performans odaklı olması lazım çözümlerin.




    < Bu mesaj bu kişi tarafından değiştirildi scientia -- 3 Nisan 2021; 16:58:18 >




  • quote:

    Orijinalden alıntı: SBK

    Neyi ispatlamaya çalışıyorsun bilmiyorum ama burada sabit bir maske, xor ve sadece sifirinci bite bakip logic shift ile O(1) de yapılan işlemin gerçekten rastgele(?) Sonuçlar vermeyeceği zaten bariz değil mi?


    Systick veya başka bir şekilde randomize edilmiş bir seed ile başlarsak random gozuken ve tekrar etmeyen bir sayı dizisini O(1) de elde edebiliyoruz. Hash table vs gibi bir seyle tekrarlayan sayi var mi diye aramaya gore muhtemelen onlarca kat daha hizli ve herhangi ekstra memory space ihtiyaci da yok.

    integer based embedded system'lerde rastgele sayi dizisi uretmek icin neredeyse standart olarak bu tip bit manipulasyonlari kullaniliyor. Ha illa random olmasi cok onemli ise, secure processorlerde TRNG diye dedicated bir hardware unit oluyor. Cunku bunu konvansiyonel olarak yapmak, kullandığın ALU bozuk degilse zaten matematiksel olarak imkansiz.

    Ben de hobi olarak retro emulatör geliştirmiştim bir ara. Makinanın ses üreteci çipi noise üretmek için random sayı oluşturması gerekiyordu. Tabi o ilkel cihazlarda şimdiki gibi kompleks trng donanımları olmadığı için basitçe iki biti xor yapıp msb'e kopyalıyordu. Bir kere de sağa iteleyince rastgele bit elde ediliyordu. Eski sistemlerle uğraşmak çok zevkli. Belki de basit oldukları içindir. Modern mimarileri anlamaya ömür yetmez.




    < Bu mesaj bu kişi tarafından değiştirildi EmuDev -- 4 Nisan 2021; 17:44:44 >




  • 
Sayfa: önceki 1234
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.