Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
51
Cevap
2433
Tıklama
1
Öne Çıkarma
Cevap: C dilinde birbirinden farklı random sayılar atama (2. sayfa)
T
4 yıl
Yarbay

Benim çözüm rekürsif işlev kullandığı için hesaplama sadece gerektiği kadar uzun sürüyor (rekürsif kodun en büyük avantajıdır) Yukarda yazdığım Lisp kodunu şimdi c++11'e dönüştürdüm:

#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>
using namespace std;

vector<int> rasgele (int boyut, int cap, 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, cap, rand() % cap + 1, liste);
    else {
      liste.push_back(rasg);
      return rasgele(boyut-1, cap, rand() % cap + 1, liste); } } }


int main (int argc, char *argv[]) {
  srand (time(NULL));
  int boyut = atoi(argv[1]);
  int cap = atoi(argv[2]);
  vector<int> gecici{};
  vector<int> listem = rasgele(boyut, cap, (rand() % cap) + 1, gecici);
  cout << "Tekrar etmeyen rasgele " << boyut << " sayi: " ;
  for_each(listem.begin(),listem.end(), [](int n){cout << n << ' ';}); }
Denerseniz oldukça hızlı ve sorunsuz çalıştığını görebilirsiniz.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Stack
S
4 yıl
Yüzbaşı

quote:

Orijinalden alıntı: SBK

/* Bryan Wilcutt's random scatter algorithm */
/* Generates random-appearing, non-repeating values. */

/* Can be any number within the given range of 32K
Mask must be changed for other ranges. */

#define START_POINT 1

void randScatter()
{
long mask; /* XOR Mask */
unsigned long point;
int val;
unsigned int range = 0x7fff; /* 32K */

mask = 0x6000; /* Range for 32K numbers */

/* Now cycle through all sequence elements. */

point = START_POINT;

do {
val = point % range; /* Get random-appearing value */
printf("%08x\n", val);

/* Compute the next value */

if (point & 1) {
/* Shift if low bit is set. */

point = (point >> 1) ^ mask;
} else {
/* XOR if low bit is not set */

point = (point >> 1);
}
} while (point != START_POINT); /* loop until we've completed cycle */
}
Kodu şöyle güzelce açıkla da ardından olmadık laflar etmesin insanlar olur mu? Hadi bekliyoruz...


Bu mesaja 1 cevap geldi.
S
4 yıl
Yüzbaşı

quote:

Orijinalden alıntı: Tuğkan-0153

Benim çözüm rekürsif işlev kullandığı için hesaplama sadece gerektiği kadar uzun sürüyor (rekürsif kodun en büyük avantajıdır) Yukarda yazdığım Lisp kodunu şimdi c++11'e dönüştürdüm:

#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>
using namespace std;

vector<int> rasgele (int boyut, int cap, 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, cap, rand() % cap + 1, liste);
    else {
      liste.push_back(rasg);
      return rasgele(boyut-1, cap, rand() % cap + 1, liste); } } }


int main (int argc, char *argv[]) {
  srand (time(NULL));
  int boyut = atoi(argv[1]);
  int cap = atoi(argv[2]);
  vector<int> gecici{};
  vector<int> listem = rasgele(boyut, cap, (rand() % cap) + 1, gecici);
  cout << "Tekrar etmeyen rasgele " << boyut << " sayi: " ;
  for_each(listem.begin(),listem.end(), [](int n){cout << n << ' ';}); }
Denerseniz oldukça hızlı ve sorunsuz çalıştığını görebilirsiniz.
Dostum recursive estetik bir yaklaşım olsa dahi bizler performans söz konusu olduğunda uzak dururuz. Gönderdiğin kodu denedim. 1500 ve sonrasında maalesef çoğu kez crash oluyor. Dediğim gibi aşırı rastlantısal bir yaklaşım bu.



T
4 yıl
Yarbay

Benim kod, ev ödevi olarak işi görecek yeterlikte. Yine de 1500 adetle yaptığım denemelerde hiç crash olmadı. 1600'e cıktım yine olmadı. 1700'de bazısında crash yapmaya başladı. 5 dakikada yazılmış bir kod olarak gayet iyi yine :)



< Bu ileti mini sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @Stack
S
4 yıl
Yüzbaşı

quote:

Orijinalden alıntı: SBK

/* Bryan Wilcutt's random scatter algorithm */
/* Generates random-appearing, non-repeating values. */

/* Can be any number within the given range of 32K
Mask must be changed for other ranges. */

#define START_POINT 1

void randScatter()
{
long mask; /* XOR Mask */
unsigned long point;
int val;
unsigned int range = 0x7fff; /* 32K */

mask = 0x6000; /* Range for 32K numbers */

/* Now cycle through all sequence elements. */

point = START_POINT;

do {
val = point % range; /* Get random-appearing value */
printf("%08x\n", val);

/* Compute the next value */

if (point & 1) {
/* Shift if low bit is set. */

point = (point >> 1) ^ mask;
} else {
/* XOR if low bit is not set */

point = (point >> 1);
}
} while (point != START_POINT); /* loop until we've completed cycle */
}
Burada geçen şeyin konumuzla ilgisi yok! Basit bitwise işlemlerle her seferinde aynı sonucu döndüren tekil veriler üretiliyor.
Bu açıklamayı senin yapman gerekiyordu ama tahmin de ettiğim üzere olmadı

Ayrıca konu sahibi de ortada yok. Sorup kaybolmuş, o kadar.



S
4 yıl
Yüzbaşı

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.



< Bu ileti mobil sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
E
4 yıl
Yüzbaşı

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.pop(index)
Python'da bu şekilde yapılabilir. Aynı sayıyı tekrar bulma ihtimali yok.


Bu mesaja 1 cevap geldi.
S
4 yıl
Yüzbaşı



Mesele, elimizdeki ilk diziyi güncelleyip küçültmekten geçiyor.





< Bu mesaj bu kişi tarafından değiştirildi Stack -- 1 Nisan 2021; 11:16:8 >
Bu mesaja 1 cevap geldi.
S
4 yıl
Yüzbaşı

Sorun çözüldü yeğen kendini yorma boşuna
Bişey demiyoruz sadece olaya yanlış şekilde atladın o kadar. Severim senin teknik konuşmalarını ben


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @SBK
S
4 yıl
Yüzbaşı

Sizin önderdiğiniz çözümü konuda göremedim ben.




Bu mesajda bahsedilenler: @Stack
S
4 yıl
Yüzbaşı

"random" un tanımının ne olduğu da önemli tabi.

Eğer sonsuz sayı çekiyor olsaydık bu sayıların dağılımı (bir histogram çizdiğimizi düşünelim) uniform ise sayıların seçimine random diyebiliriz.

Histogramda non-uniform bir distribution varsa; belli sayılar diğerlerinden anlamlı derecede fazla çekilmişse veya bazı rand() implementation'larda olduğu gibi gaussian bir dağılım varsa rastgelelikten söz edemeyiz.

kripto amaçlı rastgele sayı üreten fonksiyon ve donanım bloklarının ne kadar "random" olduğu epey ciddi bir şekilde analiz edilir ve bunların fiziksel etkilerle belli sayıları çekmeleri için manipule edilip edilemeyeceği de incelenir. örneğin işlemcinin besleme voltajı ile oynanır, beslemeye belli frekanslarda transient noise eklenir, veya clock sinyali benzer şekilde manipule edilir. hatta işlemci sıvı azot ile veya environment chamber'da soğutulur, ısıtırlır. üretilen random sayıların distribution'una bakılır. (side-channel attack olarak da yapılır böyle şeyler)

şu anda en "rastgele" ve yüksek throughput'lu sayı üretimi optik olarak yapılmaktadır. quantum random number generation (QRNG) denilen bu teknoloji ile rastgele sayı üreten cihazlarla ilgili ülkemizde de özellikse savunma sanayi için çalışmalar mevcuttur, prototip cihazlar vardır.


Bu mesaja 1 cevap geldi.
S
4 yıl
Yüzbaşı

Allah razı olsun senden çok istifade ettik


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @SBK
S
4 yıl
Yüzbaşı

Gerçekten bir naneden anlasan konuyla doğrudan alakasız ve başkasına ait bir kodu paylaşmazdın.
Laf salatası yerine önce sorulanı, sonra da istenileni ayırt etmeyi öğrenmelisin. Bence sen paylaşım falan yapma daha iyi!


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @SBK
S
4 yıl
Yüzbaşı

quote:

Orijinalden alıntı: Stack

Gerçekten bir naneden anlasan konuyla doğrudan alakasız ve başkasına ait bir kodu paylaşmazdın.
Laf salatası yerine önce sorulanı, sonra da istenileni ayırt etmeyi öğrenmelisin. Bence sen paylaşım falan yapma daha iyi!
Samsung Galaxy S6-S9 arası bir telefon kullandiysan muhtemelen Android'in altinda Linux Kernel space'te calisan benim yazdigim bir device driver'i kullanmissindir.
Sende bu telefondan olmadiysa bile birkac yuz milyon insan hayatlarinin bir doneminde kullandi :)

Eger yurdisi is deneyimin yoksa veya Turkiye'de TL maas ile calisiyorsan cok gulecegim :)

Dunning Kruger sendromu tanısı koyuyorum sana. Tedavi olarak da cok okuma, kendini gelistirme ve karsindakine saygi duyma dersleri yaziyorum.

CollabEdit'te bir live session ile C/C++/Assembly (ARM veya Intel v86 mimarisi) algorithms, data structures konularinda tokatlamaya hazirim :) Rastgele 10 soru secelim bakalim kim time complexity ve space 'te daha iyi kod yaziyor. Son uc yildir mulakat yapiyorum, masanın diger tarafindayim. Eger bir silicon valley firmasinda Istanbul'da mulakata girdiysen ve sana sadece integer math kullanarak square root bulma gibi sorular sorulduysa karsima oturmussundur ve terler icinde cekip gitmissindir. Bu tabi ODTU, BOUN, ITU veya Koc mezunuysan veya yurtdisinda bir akademik derecen varsa gerceklesmis olabilir.

Son bir senedir Verilog.ile IC (bilmiyorsan Integrated circut demek) design ve SystemVerilog verification yapiyor olsam da yaklasik 18 yildir embedded system software developer olarak calistim. Fena uzerim.

Hadi git otede oyna kucultup guncelledigin dizi ve javascriptte bir kelimeyi tersten yazdirip vay beee dedirten bombos ozguveninle.





< Bu mesaj bu kişi tarafından değiştirildi SBK -- 1 Nisan 2021; 23:44:18 >

< Bu ileti mobil sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
C
4 yıl
Yüzbaşı

@SBK ben seni ta 2005 den buranın Elektronik forumundan hatırlıyorum. Elektronik forumu artık beyaz eşya tamirine döndüğü için bende buraya geldim
Burada da ergenden geçilmiyor DH nin eski elektronik forumu çok sağlamdı. Benim hatırladığım ChipArchitect vardı yine VLSI tasarımında çalaışan. BlueICE vardı, i368 vardı. Hey gidi günler


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @SBK