Thread overview
Rastgele çifter olarak aynı sayıyı seçmek
Feb 15, 2018
İbrahim
Feb 15, 2018
İbrahim
Feb 16, 2018
İbrahim
February 15, 2018

Selamün Aleyküm;

Yapmak istediğim şey şu: Mesela rastgele olarak seçeceğim 1'den 100'e kadar sayı var ve bu sayıları altta vereceğim kutulara öyle bir dizeceğim ki bir sayı sürekli değil, en fazla birkaç kere çifter olarak gelsin. Mesela kutular şu şekilde:

https://s10.postimg.org/doovn89zd/img.png

Görüldüğü gibi her sayının yine kendisi olan diğer eşi var (mesela 1'in eşi olarak 1). Tablodaki gibi 1'in eşi 1 ama 3. olarak yine 1 gelmiş,o zaman o 1 de yalnız kalmasın ona da 1 değerindeki eşini verelim.

Yani mesela

5 tane 1 varsa:
1'in eşi -> 1
1'in eşi -> 1
1'in eşi -> 1
1'in eşi -> 1
1'in eşi -> 1

tabloda toplamda 10 tane 1 olacak. Lakin sürekli olarak aynı sayıları vermek istemiyorum, 1'den 100'e kadar çeşit çeşit eş olarak sayılar versin ve AxB boyutundaki diziye bu eş sayıları atsın istiyorum. Bunu yapmanın en iyi algoritması sizce nasıl olmalı?
Teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 15, 2018

Not: Hani bir oyun vardır, meyveler vardır ve kartlara çifter olarak bu meyveler dizilir. Daha sonra kartlar ters çevrilir ve bir kart açılır ve mesela elma çıktıysa diğer karta tıkladığımızda o kart da elmaysa o kartlar eşleşir ve yok olurlar. Ben de böyle birşey yapmak istiyorum.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 16, 2018

Teşekkürler Ali Hocam. Peki bu oyuna İngilizce'de ne deniyor? Adı nedir?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 15, 2018

Basit bir yöntem, diziyi oluşturduktan sonra randomShuffle() ile karıştırmak. Aşağıdaki program her sayıdan bir çift oluşturuyor çünkü ben anlattığın oyunu öyle biliyorum: her karttan iki tane vardır.

int[] tekrarlıDizi(int baş, int son, size_t tekrar) {
   // Aralıklarla daha şık yazılabilir ama bu daha basit

   int[] dizi;
   foreach (sayı; baş .. son) {
       foreach (i; 0 .. tekrar) {
           dizi ~= sayı;
       }
   }
   return dizi;
}

unittest {
   assert(tekrarlıDizi(3, 6, 2) == [ 3, 3, 4, 4, 5, 5 ]);
}

int[] karışıkDizi() {
   import std.random;
   auto dizi = tekrarlıDizi(1, 100, 2);
   randomShuffle(dizi);
   return dizi;
}

void main() {
   import std.stdio;
   auto dizi = karışıkDizi();
   writeln(dizi);
}

Eğer ikiden fazla olsun istersen sayıları rastgele ikişer ikişer seçebilirsin:

int[] tekrarlıDizi(int baş, int son, size_t adet, size_t tekrar) {
   import std.random;

   int[] dizi;
   foreach (a; 0 .. adet) {
       auto sayı = uniform(baş, son);
       foreach (i; 0 .. tekrar) {
           dizi ~= sayı;
       }
   }
   return dizi;
}

int[] karışıkDizi() {
   import std.random;
   // [1, 100) aralığında 20 çift
   auto dizi = tekrarlıDizi(1, 100, 20, 2);
   randomShuffle(dizi);
   return dizi;
}

void main() {
   import std.stdio;
   auto dizi = karışıkDizi();
   writeln(dizi);
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 16, 2018

Bu oyun Wikipedia'da "concentration (game)" maddesinde geçiyor. Başka isimleri olarak şunlar sıralanmış: match match, match up, memory, pelmanism, shinkei-suijaku, pexeso, ve pairs. (İş arkadaşım en çok "memory" diye biliyormuş.)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]