Rastgele değerlerden matris oluşturma

Benim gireceğim matris boyutuna göre, n x m olsun, rastgele sayılardan oluşup sütun sayılarındaki değerlerin toplamı birbirine eşit olan bir matris oluşturmak istiyorum. Yardımcı olabilir misiniz?

Evvela rastgele sayılardan oluşan n x m bir matris oluşturun, o var mı elinizde veya onu oluşturmaya çalışan kod? Yoksa random modülü ve listeler ile bunu yapabilirsiniz veya numpy kullanıyorsanız o daha iyi

Rastgele sayılardan matrisi oluşturuyorum fakat sütun sayılarının toplamını eşitleme kısmını yapamıyorum.

Sütunların her birindeki sayıların toplamının ayrı ayrı S olmasını istiyorsanız, evvela sütunları “normalize” edersiniz öyle ki her birindeki sayıların toplamı 1 olsun. Daha sonra da her elemanı S ile çarparsanız tamamdır

Merhaba, inşallah olayı yanlış anlamamışımdır.

Eğer verileri biz oluşturuyorsak şöyle bir kod bırakayım.
Ama veriler karşı taraftan geliyorsa maalesef bilemeyeceğim. Büyük bir matematik sorusu gibi duruyor.

Algoritma:
Önce her sutunun toplamının kaç olacağını rastgele olarak atayın. Biz bu değere S diyelim.
Örneğin bir sutunu ele alalım. Ele aldığımız sutundaki n - 1 tane elemanın değerini rastgele seçelim. Sonra kalan bir elemanı da S - diğer_elemanların_toplamları yaparsak sanırım hem her bir eleman rastgele seçilmiş olur hem de her bir sutunun toplamı S olur. Biraz hile yaptık ama olsun :yum:.

Koda bakmak isterseniz
import random

S = random.randint(-10**5, 10**5)
n = int(input())
m = int(input())
A = []
for i in range(n):
    temp = []
    for j in range (m):
        temp.append(0)
    A.append(temp)
for i in range(m):
    top = 0
    for j in range (n - 1):
        A[j][i] = random.randint(-10**5, 10**5)
        top += A[j][i]
    A[n-1][i] = S - top

Şu an müsait değilim ama biraz sonra kendi yazdığım kodu çalıştırıp sana açıklayayım.

Kolay gelsin.

Edit: yukarıda açıkladım algoritmayı.
Edit2: Kodu çalıştırdım, ben bir sıkıntı göremedim.

Bunu yapmanin tek yolu “sütun sayılarındaki değerlerin toplamı birbirine eşit olan bir matris” bulana kadar rastgele sayilardan olusan matris uretmeye devam etmek.

Daha pratik bir yol ariyorsan rastgeleligin ve toplamlarin tanimlarini/parametrelerini/sinirlarini belirlemen lazim.

1 Beğeni

Öncelikle kullanıcıdan matrisin satır ve sütün sayılarını girmesini istiyorum. Daha sonra girilen değere göre 0 ile 9 rakamları ile rastgele bi matris oluşturmasını istiyorum randint ile ancak buraya sütündaki elemanların toplamı eşit olmalı koşulunu ekleyemiyorum.

Kodumu incelediysen zaten bu verileri kullanıcıdan alıyorum.

Bunları zannederim kendin koda uyarlanabilirsin. Kolay gelsin.

O zaman rasgele seçtiğimiz S den rasgele seçtiğimiz a yı çıkarınca S - a rastgele olmuyor mu? Evet aslında rastgeleliğin nasıl tanımlandığı da önemli, ben burada rastgeleliği bizim kendi irademizle seçmediğimiz şey olarak farz ettim.(bu işin teknik bölümünü bilmediğim için mazur görürsünüz artık bu tanımlamayı.)
Edit: tanımlamayı da yanlış yaptım sanırım.

Evet, ama S’den de a’dan da farkli bir dagilima sahip oluyor.

Aynen. Estagfirillah.

“Rastgele” fazla genis bir terim. Pseudorandom / cryptographic random / true random gibi implementasyon detaylarini atladigimizda bile yetmiyor: "Rastgele bir sayi"dan bahsetmek icin dagilimini bilmek gerekiyor: 1 ila 10 arasinda uniform, 0 merkezli 42 standart sapmali Gaussian, vs.

Ucuncu kisiler icin soyle basitlestireyim: %99 ihtimalle 0, %1 ihtimalle 1 donduren bir fonksiyon da rastgele.


n tane rastgele sayi olsun ama toplamlari da bir sey olsun” dersen bir ozgurlukten feragat etmen lazim. Mesela “toplamlari X sayisi olsun” dersen sadece n-1 sayi uretebilirsin. Veya toplamlari X olana kadar ugrasirsin. (Bu ikisinin ne kadar benzer/ayni dagilimlar urettiklerini bilmiyorum bu arada. Ama kesin arastirilmistir.)

Ayni sekilde ilk kolonun toplamini belirleyip digerlerini ona uydurmakla ilk iki kolonun toplaminin ayni olmasini bekleyip digerlerini onlara uydurmakla toplami onden secip ona gore butun kolon yaratmak arasinda da fark var.

Edit: Gaussian (normal) dagilimin limitleri yok. Kotu ornek vermistim, duzelttim.

1 Beğeni

Merhaba,

Bu örnekte, rastgele seçimin yapılacağı sayı aralığının geniş olması, sütun toplamı eşit olan satırlar elde etme ihtimalini azaltır.

Ayrıca sütun sayısının fazla olması da sütunlardaki değerlerin toplamının eşit olma olasılığını da azalıyor.

Şöyle bir örnek yaptım, bir inceleyin isterseniz:

#!/usr/bin/python3.8
# -*- coding: utf-8 -*-

import random


def mul(array):
    return array[0] * mul(array[1:]) if array else 1


def reshape(array, shape=(1, )):
    if len(array) != mul(shape):
        raise ValueError(
            f"cannot reshape array of size {len(array)} "
            f"into shape {shape}"
        )
    if len(shape) == 1:
        return array
    return [
        reshape(
            array=array[i:i + len(array) // shape[0]],
            shape=shape[1:]
        )
        for i in range(0, len(array), len(array) // shape[0])
    ]
    
    
def is_the_sum_of_column_values_the_same(array):
    return len(set(array)) == 1
    
    
def get_sums(array):
    return [
        sum(array[j][i] for j in range(len(array))) 
        for i in range(len(array[0]))
    ]
         
    
def get_result(start, end, shape):
    while True:
        arr = reshape(
            array=[random.randint(start, end) for i in range(mul(shape))],
            shape=shape
        )
        sums = get_sums(arr)
        result = is_the_sum_of_column_values_the_same(sums)
        if result:
            return {
                "array": arr,
                "sum": sums,
                "status": result
            }

Denemeler:

# Hızlıca işlem sonlanır.
print(get_result(start=0, end=1, shape=(2, 10)))

# İşlemin gecikmeye başladığını gözlemleriz.
print(get_result(start=0, end=2, shape=(2, 10)))

# İşlem baya bir geç sonlanır.
print(get_result(start=0, end=3, shape=(2, 10)))

# İşlem üstteki duruma göre daha hızlı sonlanır. 
# Her ne kadar rastgele üretilecek sayının aralığı
# geniş olsa da, sütun sayısı az.
print(get_result(start=0, end=10000, shape=(10, 2)))